• 有序数组每个数平方后,不同数字的个数?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 }

     

  • 相关阅读:
    JAVA中的注解小结
    终结任务
    共享资源访问
    基本线程机制
    HashSet、LinkedHashSet、TreeSet
    EnumMap
    LinkedHashMap及其源码分析
    集合迭代器快速失败行为及CopyOnWriteArrayList
    LinkedList
    比特币中的Base58 编码
  • 原文地址:https://www.cnblogs.com/xudong-bupt/p/4002765.html
Copyright © 2020-2023  润新知