设计思路
起初看到这道题第一个想法就是先排序再找出最中间一个ID,但是老师要求时间复杂度是o(n),所以这个思路被放弃。
高长志同学提出了另一种思路。由于水王的ID出现的次数占总数的一半,所以从头遍历一遍,先存入第一个ID,依次与后面的ID比较,遇到相同的ID,计数器加1;遇到不同的ID,计数器减1,当计数器等于0时,证明前面出现的ID都是成对的,而且可以同时消去,再存入当前的ID,依次循环。循环到最后剩下的ID就是水王。
源程序代码
1 #include <iostream> 2 using namespace std; 3 4 void main() 5 { 6 int biao[10],i; 7 cout<<"请输入ID列表:"; 8 for (i=0;i<10;i++) 9 { 10 cin>>biao[i]; 11 } 12 int a=0,n=0; 13 for (i=0;i<10;i++) 14 { 15 if (n==0) 16 { 17 a=biao[i]; 18 n=1; 19 } 20 else 21 { 22 if (a==biao[i]) 23 { 24 n=n+1; 25 } 26 else 27 n=n-1; 28 } 29 } 30 cout<<"水王是:"<<a<<endl; 31 }
运行结果截图
编程总结
这个问题要求编程者换一种不同的思路,不能用平常的思路来思考。不同的题目适合不同的数学模型,多培养发散式思维,不能固守一种想法。