中软面试题
中软的面试比较经典,也比较严格,一般有四轮,类似于微软的面试。中软面过以后,根据项目组,会推到美国微软那边运用live meeting & con-call 再面一次。
1. English communication. (sale yourself, project information, your interesting,and how to deal with problem you encounter etc.)
2. the using of key words "new".(其实就是virual,override,new,overwrite的区别)
3. Write a method which can remove the same unit from a Array which has been sorted.
{
if (a.Length==0)
{
return a;
}
List <int> Result = new List<int>();
int i , j;
i = j = 0;
int temp = a[0];
while (i < a.Length)
{
if (a[i] != temp)
{
j++;
temp = a[i];
Result.Add(temp);
}
i++;
}
// convert List to Array
//......
return Result;
}
4. Judge Triangle and write test case for your code.
public int Triangle(int a, int b, int c)
{
if (a <= 0 || b <= 0 || c <= 0)
{
return 4;
}
int [] arry = new int [3] { a, b, c };
Array.Sort(arry);
int min, mid, max;
min = arry[0];
mid = arry[1];
max = arry[2];
if (max-mid<min) // 注意:用这个去判断是否能构成三角形
{
return 4; //不能构成三角形
}
if (min == max)
{
return 1; //等边
}
else if ( mid==min || mid == max)
{
return 2; // 等腰
}
else
return 3; // 其他
}
在 这里,我最想提的就是这一题了,因为,我们知道,判断三角形,我们常用 两边之和大于第三边。但是,在这里,就不能用了。例如: a= int.MaxValue, b=int.MaxValue, c=int.MaxValue, 这时候三边肯定能构成三角形,但是,a+b 的和已经超过了int 型的最大值。造成内存溢出。 有人说,内存溢出 就是 0 或者负数,用这个不就可以判断吗?这个还真不行。你可以多写几个test case 试试。
Test case:
其他的普通的case,我就不写了,在这里就强调一下,边界值的问题(也就是常说的 临界值)。int.maxvalue, 0 etc.
5.Reverse string.
{
char temp;
int len = end - start;
int i=0;
while(i<len/2)
{
temp = str[start+i];
str[start +i] = str[end -i - 1];
str[end-i-1] = temp;
i++;
}
return str;
}
public string Reverse(string str)
{
if (String.IsNullOrEmpty(str))
{
return null;
}
char [] objstr = str.ToCharArray(); ;
int length=objstr.Length;
objstr = Convent(objstr,0,length);
int i = 0;
int start=0,end=0;
while (i < length)
{
if (objstr[i] == ' '||i==length-1)
{
if (i == length - 1)
{
end = i + 1;
}
else
{
end = i;
}
objstr = Convent(objstr, start, end);
start = end+1;
}
i++;
}
return new string(objstr);
}
6. Find the most width level in a tree and return the count of level, if there are many one, just return the nearest level. (it can be found in the internet)
int Width(BinTree T)
{
int static n[M];//向量存放各层结点数
int static i=1;
int static max=0;//最大宽度
if(T)
{
if(i==1) //若是访问根结点
{
n[i]++; //第1层加1
i++; //到第2层
if(T->lchild)//若有左孩子则该层加1
n[i]++;
if(T->rchild)//若有右孩子则该层加1
n[i]++;
}
else
{ //访问子树结点
i++; //下一层结点数
if(T->lchild)
n[i]++;
if(T->rchild)
n[i]++;
}
if(max<n[i])max=n[i];//取出最大值
Width(T->lchild);//遍历左子树
i--; //往上退一层
Width(T->rchild);//遍历右子树
}
return max;
}//算法结束
7. Implement the function: Int ConvertToInt(string num)
{
int result=0;
int temp=0;
if (!string.IsNullOrEmpty(num))
{
if (IsInteger(num))
{
for (int i = 0; i < num.Length; i++)
{
temp = result;
result = result * 10 + ((int)num[i] - 48); //0 的Asscall码 是48
if (temp == result)
continue;
}
if (temp != result)
{
throw new Exception("overflow");
}
}
}
return result;
}
// 判断字符串是否是整数。
public bool IsInteger(string strIn)
{
bool bolResult = true;
if (strIn == "")
{
bolResult = false;
}
else
{
foreach (char Char in strIn)
{
if (char.IsNumber(Char))
continue;
else
{
bolResult = false;
break;
}
}
}
return bolResult;
}
关于上面的判断字符串里转换后是否是整数,还有其他的方法:
{
char[] ch = new char[str.Length];
ch = str.ToCharArray();
for (int i = 0; i < ch.Length; i++)
{
if (ch[i] < 48 || ch[i] > 57)
return false;
}
return true;
}
8. Quick sort. (you can get it from internet)
{
if (begin < 0 || end < 0 || begin > end)
return;
int left = begin, right = end, temp;
temp = array[left];
while (right != left)
{
while (temp < array[right] && right > left)
right--;
if (right > left)
{
array[left] = array[right];
left++;
}
while (temp > array[left] && right > left)
left++;
if (right > left)
{
array[right] = array[left];
right--;
}
}
array[right] = temp;
Quicksort(array, right + 1, end);
Quicksort(array, begin, right - 1);
}
另加一个问题:不用零时变量来交换连个整数
最简单的:
int c = b;
b = a;
a = c;
或者:
int c=a+b;
a=c-a;
b=c-a;
不使用中间变量的:
a = a + b;
b = a - b;
a = a - b;
也可以用乘法:
a = a * b;
b = a / b;
a = a / b;
但是不管是用加还是乘都会遇到越界的问题,还是最简单的好啊!