# 几个大公司（IBM、MicroSoft and so on）面试经典数据结构与算法题C#解答

## 1.链表反转

  1 namespace 链表反转
2 {
3     class Node
4     {
5         public int Num { get; set; }
6         public Node Next { get; set; }
7     }
8     class Program
9     {
10         static void Main(string[] args)
11         {
12             NodeList list = new NodeList();
18             list.Reverse1();
19             list.Print();
20
21             NodeList list1 = list.Reverse();
22             list1.Print();
23
25         }
26     }
27
28     class NodeList
29     {
30         public Node Head { get; set; }
32         {
34             {
36                 Head.Next = new Node() { Num = num };
37             }
38             else
39             {
41                 while (tn.Next != null)
42                 {
43                     tn = tn.Next;
44                 }
45                 tn.Next = new Node() { Num = num };
46             }
47         }
48
49         public void Print()
50         {
52             while(tn.Next!=null)
53             {
54                 tn = tn.Next;
55                 Console.WriteLine(tn.Num);
56             }
57         }
58
59         //需要开新链表的反转
60         public NodeList Reverse()
61         {
62             NodeList list = new NodeList();
64             Node newTn = null;
65             while (tn.Next != null)
66             {
67                 tn = tn.Next;
68                 if (newTn == null)
69                 {
70                     newTn = new Node() { Num = tn.Num };
71                 }
72                 else
73                 {
74                     newTn = new Node() { Num = tn.Num,Next=newTn };
75                 }
76             }
79             return list;
80         }
81
82         //不需要开新链表的反转
83         public void Reverse1()
84         {
87             //第一个节点也就是反转后的最后一个节点，Next要指向null
89             first.Next = null;
90             //如果链表为空或者链表只有一个元素那就无需调整
91             if (n2 == null || n1 ==null)
92             {
93                 return;
94             }
96             while (n2.Next != null)
97             {
99                 n2.Next = n1;
100                 n1 = n2;
102             }
103             //最后要将头结点指向链表反转前的最后一个元素
105             //因为判断条件只调整到最后一个元素的前一个元素，所以要调整最后一个元素的Next指向
106             n2.Next = n1;
107         }
108     }

## 2.字符串查找第一个不重复的字母

 1 namespace 字符串查找第一个不重复的字母
2 {
3     class Program
4     {
5         static Hashtable hash = new Hashtable();
6         static void Main(string[] args)
7         {
8             string s = "asfgasjfoiwoeqkwzxc";
9             Count(s);
10             Console.WriteLine(Search(s));
12         }
13
14         static void Count(string s)
15         {
16             for (int i = 0; i < s.Length; i++)
17             {
18                 if (hash.Contains(s[i]))
19                 {
20                     hash[s[i]] = (int)hash[s[i]]+1;
21                 }
22                 else
23                 {
24                     hash[s[i]] = 1;
25                 }
26             }
27         }
28
29         static char Search(string s)
30         {
31             for (int i = 0; i < s.Length; i++)
32             {
33                 if ((int)hash[s[i]] == 1)
34                 {
35                     return s[i];
36                 }
37             }
38             return '#';
39         }
40     }
41 }

## 3.有一个已经排序的数组（升序），数组中可能有正数、负数或0，求数组中元素的绝对值最小的数，要求，不能用顺序比较的方法（复杂度需要小于O（n）），可以使用任何语言实现

（PS:为了方便我写到一个JUnit方法中）

public class testAlgorithm {
@Test
public void Fun(){
int[] a = {-8,-7,-5,1,3,5};

int middle = (a.length-1)/2;
int result = middle;

if (a[middle]==0){
System.out.println("The smallest number is "+a[middle]);
return;
}
//find the demarcation point
else{
if(a[result]>0){
while(a[result]>0){
result = result - 1;
}
if(Math.abs(a[result])>a[result+1]){
System.out.println("The smallest number is "+a[result+1]);
return;
}
else{
System.out.println("The smallest number is "+a[result]);
return;
}
}
else{
while(a[result]<0){
result = result + 1;
}
if(a[result]>Math.abs(a[result+1])){
System.out.println("The smallest number is "+a[result+1]);
return;
}
else{
System.out.println("The smallest number is "+a[result]);
return;
}
}

}

}

}

posted @ 2015-05-03 20:43  Sunnier  阅读(5747)  评论(0编辑  收藏  举报