面试经典150题之每日几题

一.删除有序数组中的重复项

思路:两个指针,一个left,一个right,如果left和right数组元素相同,right就前进一个,若不同,left前进一个(因为前面若有重复元素,left前进一格后所在元素就是需要被覆盖的重复元素)并且将right此时的数组值赋予left所在数组,直到right走到最后,返回left的值。

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int left=0;
        int right=1;
        if(nums.size()==0){
            return 0;
        }
        else{
            while(right<nums.size()){
            if(nums[left]==nums[right]){
            right++;
        }
            else{
            left++;
            nums[left]=nums[right];
        }
        }
        } 
        return left+1;
    }
};

2.重复项出现两次

思路:两个指针(left和right)left代表已经检查过的数组元素,right代表将要检查的数组元素,right所在的元素要与(left-2)元素对比【因为要求可以保留两个相同的】如果相同则无法保留,如果不同就放置在left的位置,left位移下一个。

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        if(nums.size()<=2){
            return nums.size();
        }
        int left=2,right=2;
        while(right<nums.size()){
            if(nums[left-2]!=nums[right]){
                nums[left]=nums[right];
                left++;
            }
            right++;
        }
        return left;
    }
};

三.多数元素

利用哈希表存储,最后找出大于n/2的:

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        unordered_map <int,int> hashmap;
        int res=0;
        for(int n:nums){
            hashmap[n]++;
            if(hashmap[n]>nums.size()/2){
            res=n;
        }
        }
        return res;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值