剑指offer 面试题3
来源:互联网 发布:营销qq群发软件 编辑:程序博客网 时间:2024/06/04 18:15
/***********************************剑指offer面试题3:找出数组中重复的数字**语言:C++**Writted by XRJ on 2017/10/24************************************/#include <iostream>#include <set>using namespace std;//方法1:不考虑时间效率的做法//直接给数组排序,然后找重复,数组排序的最坏时间复杂度为O(nlogn)bool Bubble_sort(int a[],const int length){if (length <= 0 || a == NULL){return 1;}for (int i = 0;i<length;i++){if (a[i]>=length || a[i]<0){return 1;}}for (int i = 0;i<length;i++){for(int j = i+1;j<length;j++){if (a[i] > a[j]){swap(a[i],a[j]);}}}return 0;}bool find_same1(int a[],const int length){if (length <= 0 || a == NULL){return 1;}for (int i = 0;i<length;i++){if (a[i]>=length || a[i]<0){return 1;}}Bubble_sort(a,length);int flag = -1;for (int i = 0;i < length;i++){if ((a[i] == a[i+1]) &&(a[i+1] != flag)){cout<<a[i]<<" ";flag = a[i];}}return 0;}//方法2:使用哈希表将时间效率变为O(n),空间效率变为O(n)//借用哈希表的元素不重复bool find_same2(int a[],const int length){if (length <= 0 || a == NULL){return 1;}for (int i = 0;i<length;i++){if (a[i]>=length || a[i]<0){return 1;}}set<int> Temp;int flag = -1;for (int i = 0;i<length;i++){if (Temp.find(a[i]) == Temp.end()){Temp.insert(a[i]);}else{if (a[i] != flag){cout<<a[i]<<" ";}flag = a[i];}}return 0;}//方法3:分析具体问题,找到内在规律//时间复杂度为O(n),空间复杂度为O(1)bool find_same3(int a[],int length){if (length <= 0 || a == NULL){return 1;}for (int i = 0;i<length;i++){if (a[i]>=length || a[i]<0){return 1;}}int flag = -1;for (int i = 0;i<length;i++){if (a[i] != i){if (a[i] == a[a[i]]){if (a[i] != flag){cout<<a[i]<<" ";}flag = a[i];}else{swap(a[i],a[a[i]]);}}}return 0;}int main(int argc,char** argv){//测试用例int a[10] = {0,2,5,8,2,2,3,5,6,0};int *b = NULL;int c[10] = {0,1,2,3,4,5,6,7,8,9};/*三种方法的越界判断以及输入正确判断要记得加*/cout<<"重复数字为:";if(find_same1(a,10)){cout<<"输入不合法";}cout<<endl;cout<<"重复数字为:";if(find_same2(b,10)){cout<<"输入不合法";}cout<<endl;cout<<"重复数字为:";if(find_same3(c,10)){cout<<"输入不合法";}cout<<endl;system("pause");return 0;}
前两种都没什么说的,关键第三种方法比较难一点
说一下写完代码的感想吧:
1:输入参数的检验非常重要(合法输入的检查)
2:活用hash table可以在一定程度上用空间换时间,降低时间复杂度,但是有一定额外空间负担
3:遇到具体问题时能否按照具体要求,分析出问题中的内在规律,找出关键所在~本题的第三种解法正是由此而来,最关键的就是第一句话:长度为n的数组中所有数字都在0~n-1范围内
阅读全文
0 0
- 剑指offer面试题3
- 《剑指offer》面试题3
- 剑指offer 面试题3
- 剑指offer面试题3
- 【面试题】剑指offer 3
- 剑指offer 面试题3
- 剑指offer 面试题
- 剑指offer面试题
- 读书笔记-剑指offer 面试题3
- 《剑指offer》面试题3(2)
- 剑指Offer(面试题3~5)
- 剑指Offer面试题3 & Leetcode74
- 剑指offer面试题总结
- 剑指offer面试题06
- 剑指offer面试题 04
- 剑指offer 面试题07
- 剑指offer面试题08
- 剑指offer面试题42
- Java异常
- 四则运算
- 水平居中
- C++ Virtual详解
- 阿里云申请免费DV SSL证书部署https全过程
- 剑指offer 面试题3
- awk 学习小结
- UserAgentUtils-1.13.jar
- 关于List集合
- js操作对象中点操作和中括号操作的区别
- 接收邮件测试的测试点
- 求数列的和
- SSM综合项目实战(TTSC) -- day09 Solr,搜索系统
- 高通平台LK传递参数给kernel参考serialno的方式实现