课堂实验--贴吧找水王问题续
课堂实验--找水王续
一、设计思想
这次的实验题目是找到发帖数目超过帖子数目的四分之一的三个ID,相比与上次的实验又增加了一个难度。在这周一上理论课的时候老师请同学们上讲台演示了上次的实验思路,我看到了好多好的方法,也看到了自己上次实验的很多不足之处,觉得用数据结构虽然使设计思路变得简单,但是没有将空间复杂度降为O(n),在同学们的启发下,我试着在这次实验时顺着这种思路将空间复杂度降为O(n)。
既然有三个水王,也就是说有三个ID数都超过了整个ID的四分之一,因此,同时删除四个不相等的ID不会改变这个性质。若在遍历数组时出现相同ID则利用计数器记下它出现的次数,这样到最后剩下的三个ID便是那个出现次数最多的三个水王了。
二、代码实现
//Ying Hao 2016/5/27 //找出贴吧中数目均超过四分之一的三个水王 #include <iostream> using namespace std; int main() { int N,i,arr[1000],num=0,num1=0,num2=0,a[3]={0,0,0};//arr[]用来存放ID,num,num1,num2存放暂定水王的数目,a[]用来存放暂定水王 do { cout<<"请输入ID数:"; cin>>N; if(N==3)//若只有三个ID,则这三个ID就是水王 { break; } if(N<7)//小于7个ID不可能出现水王 { cout<<"请输入合适的ID数!(输入的数目不存在3个水王!)"<<endl; } }while(N<7); cout<<"请输入ID:"; for(i=0;i<N;i++) { cin>>arr[i]; } if(N!=3) { for(i=0;i<N;i++)// { if(a[0]==arr[i]) { num++; } else if(a[1]==arr[i]) { num1++; } else if(a[2]==arr[i]) { num2++; } else if(num==0) { a[0]=arr[i]; num++; } else if(num1==0) { a[1]=arr[i]; num1++; } else if(num2==0) { a[2]=arr[i]; num2++; } else { num--; num1--; num2--; } } } else { a[0]=arr[0]; a[1]=arr[1]; a[2]=arr[2]; } cout<<"这三个水王分别是:"<<a[0]<<","<<a[1]<<","<<a[2]; cout<<endl; return 0; }
三、实现截图
当ID数为3时,则这三个ID就是水王:
当ID数为7时:
当ID数为4时不存在水王,当ID数为15时:
四、个人总结
通过这次的实验我觉得使我收获最大的就是编程的设计思路的提升,和上一次实验相比,思路显得更加灵活了,并且在此次实验的扩展的基础上,了解了这一系列问题的解决方法,若再进行扩展,只要按照这个思路的话还是可以将其实现的,我觉得这次实验就是一个数学问题,再用编程的形式体现出来,主要的核心和关键还是在那句“超过总贴的四分之一”上,只要将不同的四个ID同时消除是不会影响这一性质的,因此在这次实验中,我收获的是思想,也顺利的将空间复杂度降为了O(n),相信在接下来的课堂实验或者是大作业都对我有所帮助和启发,我会再接再厉的!