算法提升(C++)2020-09-06 — 2020-09-13

这一周的算法练习涵盖了一系列的C++题目,包括数组操作、位运算、数论问题和字符串处理等。比如十进制整数的反码、最小移动次数使数组元素相等、阶乘后的零、一年中的第几天以及最大三角形面积等。通过这些题目,可以锻炼和提升C++编程和算法能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2020-09-06
第一题: 十进制整数的反码

class Solution {
public:
    int bitwiseComplement(int N) {
        int temp1 = N;
        int temp2 = 1;
        if(N==0) return 1; 
        while(temp1>0) {
        N^=temp2;
        temp2<<=1;
        temp1>>=1;
        }
            return N;
        }
};

第二题:最小移动次数使数组元素相等

class Solution {
public:
    int minMoves(vector<int>& nums) {
        int min = nums[0]; 
        long long result = nums[0];
        for(int i = 1; i < nums.size(); i++) {
            result += nums[i];
            if(nums[i] < min) {
                min = nums[i];
            }
        }
        return result- min*nums.size();
    }
};

第三题:最少移动次数使数组元素相等 II

class Solution {
public:
    int minMoves2(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        int i = 0; 
        int j = nums.size()-1;
        int result = 0;
        while(i<j) {
            result += nums[j--]-nums[i++];
        }
        return result;
    }
};

2020-09-07
第一题:错误的集合

class Solution {
public:
    vector<int> findErrorNums(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        int tmp1;
        int lost;
        int sum = 0;
        int repet;
        for(int i = 0; i < nums.size()-1; i++) {
          if(nums[i] == nums[i+1]) repet = nums[i];
          sum += nums[i];  
        }
        sum+=nums[nums.size()-1];
		lost = (nums.size() + 1)*nums.size() / 2 - (sum - repet);  //eg. 错误集合 1 2 2 4     已找到repet=2,sum-repet(错误集合剔除重复元素2,即1 2 4),
       return {repet,lost};
    };
};

2020-09-09
第一题:二进制间距

class Solution {
public:
    int binaryGap(int N) {
    int tmp1 = 0;
        int tmp2 = 0;
        int max = 0;
        while(N>0){
            if(N%2 == 1) {
                tmp1++; 
                
            }
            if(tmp1 > 0) {
                tmp2++;
            }
            if(tmp1 == 2) {
                if(tmp2-1 > max) {
                    max = tmp2-1;
                }
                tmp1 = 1; 
                tmp2 = 1;
            }
            N/=2;
        
        }
        return max;
    }
};

第二题:好数对的数目

class Solution {
public:
    int numIdenticalPairs(vector<int>& nums) {
 int number = 0;
    for(int i = 0; i < nums.size(); i++) {
        for(int j = i+1; j < nums.size(); j++) {
            if(nums[i] == nums[j]) {
                number++;
            }
        }
    }
    return number;
    }
};

第三题:缺失数字

class Solution {
public:
    int missingNumber(vector<int>& nums) {
        int i = 0;
            sort(nums.begin(), nums.end());
            for(; i < nums.size(); i++) {
                if(i != nums[i]) {
                    return i;
                }
            }
            return i;
        }
};

2020-09-10
第一题:阶乘后的零

class Solution {
public:
    int trailingZeroes(int n) {
        int num = 0;
        while(n) {
            num+=n/5;
            n /= 5;
        }
        return num;
    }
};

第二题:计数质数

class Solution {
public:
    int countPrimes(int n) {
    int num = 0;
    if(n == 0 || n == 1 || n == 2) {
        return 0;
    }
    for(int i = 3; i < n; i+=2) {
        for(int j = 3; j <= sqrt(i); j+=2) {
            if(i%j == 0) {
             num++;
             break; 
            }
        }
    }
    return n/2-num;
    }
};

第三题:Excel表列序号

class Solution {
public:
    int titleToNumber(string s) {
            int res = 0;
            for(auto ss : s){
                res = res * 26 + (ss - 'A' + 1);
            }
            return res;
    }
};

2020-09-11
第一题:增减字符串匹配

class Solution {
public:
    vector<int> diStringMatch(string S) {
 vector<int> nums;
		//用n和x分别保存插入后下次插入的数据
		int  n = S.size(), x = 0;
		for (char c : S) {
			//c=='I' 插入x 并x++
			if (c == 'I') {
				nums.push_back(x);
				x++;
			}
			else {
				//c=='D' 插入n并n--
				nums.push_back(n);
				n--;
			}
		}
		//最后插入 x++或n--都可以
		nums.push_back(n--);
    return nums;
    }
};

第二题:一年中的第几天

class Solution {
public:
    int dayOfYear(string date) {
       int year = (date[0]-'0')*1000 + (date[1]-'0')*100 + (date[2]-'0')*10 +date[3]-'0';
       int month=(date[5]-'0')*10 + date[6]-'0';
       int day=(date[8]-'0')*10 + date[9]-'0';
       int months[2][13] = {{0, 31,28, 31, 30, 31, 30, 31,31,30,31, 30, 31},
                        {0, 31,29, 31, 30, 31, 30, 31,31,30,31, 30, 31}};
        int result = 0; 
        if(year % 400 ==0 || (year%4==0&&year%100!=0)){
            for(int i= 0; i < month; i++) {
                result += months[1][i];
            }
        } else {
            for(int i= 0; i < month; i++) {
                result += months[0][i];
            }
        }
       return result+day;
    }
};

第三题:最大数值

class Solution {
public:
    int maximum(int a, int b) {
        int ans= ((long)abs((long)a-(long)b)+a+b)/2;
        return ans;
    };
    long abs(long a) {
        int flag = a >> 63; //正数flag = 0,负数flag = -1
        return (flag ^ a) - flag; //任何数与0异或值不变,任何数与-1异或等价于按位取反
    }

};

2020-09-12
第一题:在区间范围内统计奇数数目

class Solution {
public:
    int countOdds(int low, int high) {
int num = 0;
    if(low%2 == 0) { // low是偶数  
        low+=1;
        while(low <= high) {
            num++;
            low+=2;
        } 
    } else {
        while(low <= high) {
            num++;
            low+=2;
        } 
    }
    return num;
    }
};

第二题:丑数

class Solution {
public:
    bool isUgly(int num) {
         if(num == 0) return false;
    else if(num == 1) return true;
    while(1) {
       if(num % 2 == 0) {
           num/=2;
       }else if(num%3 == 0) {
           num/=3;
       }else if(num%5 == 0) {
           num/=5;
       }else{
           break;
       }
    }
    if(num == 1) {
        return true;
    }
    return false;
    }
};

第三题:缀点成线

class Solution {
public:
    bool checkStraightLine(vector<vector<int>>& coordinates) {
        double a,b,c,d;
            a=coordinates[0][0];
            b=coordinates[0][1];
            c=coordinates[1][0];
            d=coordinates[1][1];
            for(auto i:coordinates){
                if((i[1]-b)*(c-a)!=(i[0]-a)*(d-b)) return false;
            }
            return true;
    }
};

第四题:将整数转换为两个无零整数的和

class Solution {
public:
    vector<int> getNoZeroIntegers(int n) {
 int b;
   for(int i = 1; i < n; i++) {
       b = n-i;
       if((to_string(b) + to_string(i)).find('0') == string::npos) {
           return {b,i};
       }
   }
   return {};
    }
};

2020-09-13
第一题:最大三角形面积

class Solution {
public:
    double largestTriangleArea(vector<vector<int>>& points) {
 double mmax = 0;
     for (int i = 0; i < points.size(); i ++)
            for (int j = i + 1; j < points.size(); j ++)
                for (int k = j + 1; k < points.size(); k ++) 
                    mmax = max(mmax, 0.5 * abs(points[i][0] * points[j][1] + points[i][1] * points[k][0] + points[j][0] * points[k][1] - points[i][0] * points[k][1] - points[i][1] * points[j][0] - points[j][1] * points[k][0]));
        return mmax;
    }
};

第二题:打印从1到最大的n位数

class Solution {
public:
    vector<int> printNumbers(int n) {
vector<int> nums;
   for(int i = 1; i< pow(10,n); i++){
       nums.push_back(i);
   }
   return nums;
    }
};

第三题:各位相加

class Solution {
public:
    int addDigits(int num) {
        int tmp = 0;
        while(num) {
            tmp += (num%10);
            num/=10;
        } 
        if(tmp < 10) {return tmp;}
        return addDigits(tmp);
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值