微软的一个面试题
2014-04-14 20:32
274 查看
★假设你有一个用1001 个整数组成的数组,这些整数是任意排列的,但是你知道所有的整数都在1 到1000(包括1000)之间。此外,除一个数字出现两次外,其他所有数字只出现一次。假设你只能对这个数组做一次处理,用一种算法找出重复的那个数字。如果你在运算中使用了辅助的存储方式,那么你能找到不用这种方式的算法吗?
解法一:可以将数组里的每个数都相加,然后减去1-1000的和,得到的结果就是那个重复的数字
int i = 0;
int num = 0;
for (i=0; i<1001; i++)
{
num += a[i] - i;
}
最后num的值就是多那个值
解法二:
int search(int m[])
{
int w[1001];//定义一个长度为1001的辅助数组。
for(int i=0;i<=1001;i++)
w[i]=-1;//将辅助数组的每个元素赋初值为-1
for(int j=0;j<=1000;j++)
{
/*遍历那个由1001个1到1000之间的整数组成的数组m。
如果w数组中第m[j]个位置的值没有被改变即还是-1,就把整数m[j]填入到w中m[j]第位置。否则就返回那个出现两次的数字。*/
if(w[m[j]]==-1)
w[m[j]]=m[j];
else
return m[j];
}
return 0;//如果没有找到重复的数字 则返回0.
}
此解法与解法一算法方面相似。
解法三:use A XOR A XOR B = B,任何数与其本身异或值都为0。
int
findX(int a[]) {
int k = a[0];
for (int i=1; i<=1000;i++)
k ^= a[i]^i;
//这里就是对数组中的数和1-1000的每个数都进行一次异或操作,得到的结果即为那个重复的数
}
return k;
}
解法一:可以将数组里的每个数都相加,然后减去1-1000的和,得到的结果就是那个重复的数字
int i = 0;
int num = 0;
for (i=0; i<1001; i++)
{
num += a[i] - i;
}
最后num的值就是多那个值
解法二:
int search(int m[])
{
int w[1001];//定义一个长度为1001的辅助数组。
for(int i=0;i<=1001;i++)
w[i]=-1;//将辅助数组的每个元素赋初值为-1
for(int j=0;j<=1000;j++)
{
/*遍历那个由1001个1到1000之间的整数组成的数组m。
如果w数组中第m[j]个位置的值没有被改变即还是-1,就把整数m[j]填入到w中m[j]第位置。否则就返回那个出现两次的数字。*/
if(w[m[j]]==-1)
w[m[j]]=m[j];
else
return m[j];
}
return 0;//如果没有找到重复的数字 则返回0.
}
此解法与解法一算法方面相似。
解法三:use A XOR A XOR B = B,任何数与其本身异或值都为0。
int
findX(int a[]) {
int k = a[0];
for (int i=1; i<=1000;i++)
k ^= a[i]^i;
//这里就是对数组中的数和1-1000的每个数都进行一次异或操作,得到的结果即为那个重复的数
}
return k;
}
相关文章推荐
- 《卓越程序员密码》
- 黑马程序员_OC代理设计模式
- [转] 每个程序员都必须遵守的编程原则
- 腾讯2014实习面试整理
- 2014阿里巴巴面试经验-北京站研发工程师
- 阿里实习生面试经验
- 字符串常考面试题
- 微软2014机试第二题
- 黑马程序员_OC协议
- 师兄教你和面试官扯淡
- 程序员生活
- java web面试题
- 从尾到头打印链表
- 程序员人性思考
- 程序员如何快速准备面试中的算法
- 黑马程序员 ---- 博客格式
- 黑马程序员—Java IO流(Writer、Reader、FileWriter、FileReader、BufferedWriter、BufferedReader)
- 《黑马程序员》 list集合的几种迭代方式
- 《黑马程序员》 LinkedList之堆栈和队列功能的模拟
- 去哪儿网面试问题