有序数组每个数平方后,不同数字的个数?O(n)

此乃一道笔试题,当时的确也做出来啦。(但是在细节上还是出错啦,对多次重复出现的数字可能会重复计数,没有记录上次删除的元素)

 

如题,有序数组,可以知道平方之后在两边的数据较大,中间的数据较小。

          

因此可以使用两个下标,从两边向中间扫描。将绝对值大的数字删掉,计数即可,并记录刚才删除的数值的绝对值,以免出现多次相同的数据,重复计数的问题。

具体看完整代码:

 1 #include <iostream>
 2 #include <vector>
 3 #include <algorithm>
 4 using namespace std;
 5 
 6 int squareUniqueNum(vector<int> &ver){
 7     int len = ver.size();
 8     if(len < 2)
 9         return len;
10 
11     int i = 0;
12     int j = len - 1;
13     int pre = abs(ver[0]);  ///记录上次删除数据的绝对值
14     int num = 1;    ///数字为 1
15     while(i<=j){
16         ///每次删除绝对值较大的数字,并记录下删除是数字的绝对值,绝对值相同的只计数一次
17         if(abs(ver[i]) > abs(ver[j])){
18             if(pre != abs(ver[i])){ ///如果没有删过
19                 num++;
20                 pre = abs(ver[i]);
21             }
22             i++;
23         }
24         else{
25             if(pre != abs(ver[j])){ ///如果没有删过
26                 num++;
27                 pre = abs(ver[j]);
28             }
29             j--;
30         }
31     }
32     return num;
33 }
34 
35 int main()
36 {
37     vector<int> ver({-5,-3,-1,1,1,2});
38     int num = squareUniqueNum(ver);    ///求有序数组中数字平方后,消重结果中数字的个数
39     cout<<num<<endl;
40     return 0;
41 }

 

posted on 2014-09-30 22:41  旭东的博客  阅读(2818)  评论(0编辑  收藏  举报

导航