剑指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范围内

原创粉丝点击