数组(5-8)

数组(5-8)

数组中只出现一次的数字

思路: 从set的角度(set中不允许出现重复元素)
步骤:

  1. 定义一个set
  2. 遍历数组,若集合中没有该元素,则将此元素加入set中,若集合中有该元素,则将集合中的该元素删除(数组中出现两次的元素)
  3. 最终集合中留下的就是只出现一次的元素

ps:找有没有是用的set的find接口,返回的是一个迭代器,若存在返回元素位置,若不存在返回s.end();往set中加入元素用的是insert接口,删除是erase接口

class Solution {
public:
    void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
        set<int> s;
        for(int i=0;i<data.size();i++)
        {
            if(s.find(data[i])==s.end())
            {
                s.insert(data[i]);
            }
            else s.erase(data[i]);
        }
        set<int>::iterator it=s.begin();
        *num1=*it;
        it++;
        *num2=*it;

    }
};

数组中重复的数字

思路:利用set的特性,set中不允许重复元素
步骤:
1.定义一个set
2.遍历数组,若set中不存在,则往里加,若存在,就返回1,这个数组元素就是第一个重复元素

class Solution {
public:
    // Parameters:
    //        numbers:     an array of integers
    //        length:      the length of array numbers
    //        duplication: (Output) the duplicated number in the array number
    // Return value:       true if the input is valid, and there are some duplications in the array number
    //                     otherwise false
    bool duplicate(int numbers[], int length, int* duplication) {
        set<int> s;
        for(int i=0;i<length;i++)
        {
            if(s.find(numbers[i])==s.end())
            {
                s.insert(numbers[i]);
            }
            else
            {
                *duplication=numbers[i];
                return 1;
            }
        }
        return 0;

    }
};

连续子数组的最大和

思路:对于第i个位置的元素来说,若它前面的sum是负数,则没有必要加上前面的sum,从当前i开始进行求和;若它前面的sum是正数,那么加上它本身
步骤:

  1. 定义一个sum(初始值可以设为a[0])进行求和,再定义一个maxSum(初始值可以设为sum)保存最大和

  2. i从1开始遍历,若前面的sum大于0,则sum=sum+a[i];若前面的sum<0,则sum从a[i]重新开始

  3. 每一次循环后都要判断此时sum大于maxSum么,如果大于,就更新maxSum

    class Solution {
    public:
     int FindGreatestSumOfSubArray(vector<int> array) {
         int sum=array[0];
         int maxSum=sum;
         int length=array.size();
         for(int i=1;i<length;i++)
         {
             if(sum<=0)
             {
                 sum=array[i];
             }
             else
                 sum+=array[i];
             if(sum>maxSum)
             {
                 maxSum=sum;
             }
         }
         return maxSum;
    
     }
    };

    调整数组顺序使奇数位于偶数前面

思路:定义一个奇数数组和偶数数组
步骤:
1.定义两个数组,一个存放奇数,一个存放偶数
2.遍历原数组,若元素为奇数,加入到v1;若元素为偶数,加入到v2
3.清空原数组
4.分别将v1和v2中的元素加入到原数组中去

class Solution {
public:
    void reOrderArray(vector<int> &array) {
        vector<int>v1;
        vector<int>v2;
        for(int i=0;i<array.size();i++)
        {
            if(array[i]%2==0)
            {
                v2.push_back(array[i]);
            }
            else
                v1.push_back(array[i]);
        }
        array.clear();
        for(int i=0;i<v1.size();i++)
        {
            array.push_back(v1[i]);
        }
        for(int i=0;i<v2.size();i++)
        {
            array.push_back(v2[i]);
        }

    }
};
全部评论

相关推荐

08-22 11:25
已编辑
南京财经大学 Java
程序员小白条:优先背八股文,JUC,JVM这些基础概念一定要会,spring底层先放放,408也是八股优先,不考研,不用深入去学,没性价比,多搞搞算法,起码两个题单熟练刷,起码300-400题的精刷
点赞 评论 收藏
分享
09-01 21:40
已编辑
同济大学 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务