5-10 刷题

两个数组的交集 II

 我的解法:找到一个,添加一个,删除一个

 vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
        if(nums1.size()==0||nums2.size()==0);
           
        vector<int> jiaoji;
        sort(nums1.begin(),nums1.end());sort(nums2.begin(),nums2.end());
        for(int i=0;i<nums1.size();i++){
            for(int j=0;j<nums2.size();j++){
            if(nums1[i]>nums2[j])
                continue;
            if(nums1[i]==nums2[j])
            {
                jiaoji.push_back(nums1[i]);
                nums2.erase(nums2.begin()+j);
                break;
            }
              if(nums1[i]<nums2[j])  
                  break;                
            }
        }
        return jiaoji;                        

    }

解法一:同时循环迭代,节省时间同时没改变输入数组

vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {

vector<int> result = {};

if(nums1.empty() || nums2.empty())

return result;

sort(nums1.begin(), nums1.end());

sort(nums2.begin(), nums2.end());

int i1 = 0, i2 = 0;

while(i1 != nums1.size() && i2 != nums2.size()) {

if(nums1[i1] < nums2[i2]) i1++;

else if(nums1[i1] > nums2[i2]) i2++;

else {

result.push_back(nums1[i1]);

i1++;

i2++;

}

}

return result;

}

解法二:使用map的性质

vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {

vector<int> result;

if(nums1.size()==0||nums2.size()==0) return result;

unordered_map<int,int> hash;

for(int i=0; i<nums1.size(); i++){

if(hash.count(nums1[i])==0)

hash.insert(make_pair(nums1[i],1));

else hash[nums1[i]]++;

}

for(int j=0; j<nums2.size(); j++){

if(hash.count(nums2[j])>0&&hash[nums2[j]]>=1) {

result.push_back(nums2[j]);

hash[nums2[j]]--; } }

return result;

}

加一

我的解法:主要难点是进一操作;几次循环操作,检测尺寸小时加尺寸

 vector<int> plusOne(vector<int>& digits) {
        
        digits.back()++;                     
        if (digits.back()/10==1){
            digits.back()=0;   
            if(digits.size()<2)
            {
            digits.insert(digits.begin(),0);           
            }
             digits[digits.size()-2]++;
            for(int i=2;i<digits.size()+1;i++)
            {   
                if (digits[digits.size()-i]/10==1)
                {
                digits[digits.size()-i]=0;
                if(digits.size()<=i)              
                 digits.insert(digits.begin(),0);                               
                digits[digits.size()-i-1]++;                     
                }  
                else break;            
            }        
        }
        return digits;
    }

解法一:如果是10就一直加下去,如果最后一次加依旧是10,则做尺寸扩张操作

vector<int> plusOne(vector<int>& digits) {

int flag=1;

for(int i=digits.size()-1;i>-1;i--){

digits[i]=digits[i]+flag;

flag=0;

if(digits[i]==10){

digits[i]=0;

flag=1;

}

else

break;

} if(flag==1){

vector<int> ans(digits.size()+1);

ans[0]=1;

for(int i=1;i<ans.size();i++){

ans[i]=digits[i-1];

}

return ans;

}

return digits;

}

解法二:(最好的)先从后向前消灭连续的会进一的9,如果i<0说明是全9,要改变尺寸

vector<int> plusOne(vector<int>& digits) {

int i = digits.size() - 1;

while (digits[i] == 9 && i>=0) {

digits[i--] = 0; };

if (i < 0) {

digits[0] = 1;

digits.push_back(0);

} else {

digits[i]++;

}

return digits;

}

移动零

我的解法:记录多少0的元素并删除,之后再添加

 void moveZeroes(vector<int>& nums) {     
        int j=0;
        for(int i=0;i<nums.size();i++)
        {
            if(nums[i]!=0)
                continue;
             if(nums[i]==0)
            {
               j++;
                nums.erase(nums.begin()+i); 
                i--;
            }            
        }
        for(int z=0;z<j;z++)
            nums.push_back(0);       
    }

解法一:直接复制简单明了

 void moveZeroes(vector<int>& nums) { 

int n=nums.size();

if(n==0) return ;

int count=0;

for(int i= 0;i<n;i++){

if(nums[i]!=0) nums[count++]=nums[i];

}

while(count<n)

nums[count++]=0;

}

猜你喜欢

转载自blog.csdn.net/a1111h/article/details/80267881
今日推荐