LeetCode - 9 - (整数反转、字符串转整数atoi、二进制距离、整数转罗马数字、最接近的三数之和)

 

class Solution {
public:
    int reverse(int x) {
        if(x>INT_MAX||x<-INT_MAX) return 0; // 可能输入的数就超出范围
        if(x>-10&&x<10) return x;  // 个位数不用反转直接输出
        string s;
        int flag = 0;
        if(x<0){  // 负数标记一下
            flag = 1;
            x = -x;
        }
        while(x){
            int t = x%10;
            // cout << "t: " << t << endl;
            s += t+'0';
            x /= 10;
        }
        long long ans = s[0]-'0';  // 处理的过程中可能越界,需要用ll存储
        for(int i = 1; i < s.size(); i ++){
            ans *= 10;
            ans += s[i]-'0';
        }
        if(flag) ans *= -1;
        if(ans>INT_MAX||ans<-INT_MAX) return 0;
        return ans;
    }
};

 

 

 

 

 

class Solution {
public:
    int myAtoi(string s) {
        long long f = 0, ans = 0;
        for(int i = 0; i < s.size(); i ++){
            if(s[i]=='-'){
                if(i+1<s.size()&&!isdigit(s[i+1])) return 0; "  -x" "  - 10"的输出都为0
                f = 1;
            }
            else if(isdigit(s[i])){
                ans *= 10;
                if(ans>=0) ans += s[i]-'0';
                else ans -= s[i]-'0';
                if(ans&&f){
                    ans *= -1;
                    f = 0;
                }
                // cout << "si: " << s[i] << " ans: " << ans << endl;
                if(ans<0&&ans<-INT_MAX-1){
                    ans = -INT_MAX-1;
                    return ans;
                }
                if(ans>0&&ans>INT_MAX){
                    ans = INT_MAX;
                    return ans;
                }
                if(i+1<s.size()&&!isdigit(s[i+1])) break; // 遇到第一个非数字时终止
            }
            else if(s[i]==' ') continue; // 去除前导零
            else if(s[i]=='+'){
                if(!ans&&i+1<s.size()&&isdigit(s[i+1])) continue;
                else break; // "+-10"输出为0
            }
            else break;
        }
        return ans;
    }
};

class Solution {
public:
    string toBinary(int x){
        string ans;
        while(x){
            ans += (x%2)+'0';
            x /= 2;
        }
        reverse(ans.begin(), ans.end());
        return ans;
    }
    int binaryGap(int n) {
        string s = toBinary(n);
        int pos = -1, ans = 0;
        for(int i = 0; i < s.size(); i ++){
            if(s[i]=='1'){
                if(pos==-1) pos = i;
                else{
                    ans = max(ans, i-pos);
                    pos = i;
                }
            }
        }
        return ans;
    }
};

 

 

class Solution {
public:
    string intToRoman(int num) {
        map<int, string> mp;
        mp[1] = "I";      mp[4] = "IV";
        mp[5] = "V";      mp[9] = "IX";
        mp[10] = "X";     mp[40] = "XL";
        mp[50] = "L";     mp[90] = "XC";
        mp[100] = "C";    mp[400] = "CD";
        mp[500] = "D";    mp[900] = "CM";
        mp[1000] = "M";
        int a[] = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
        string ans;
        for(int i = 0; i < 13; i ++){
            if(num/a[i]){
                int cnt = num/a[i];
                while(cnt--){
                    ans += mp[a[i]];
                }
                num %= a[i];
            }
        }
        return ans;
    }
};

 

双指针: 

class Solution {
public:
    int threeSumClosest(vector<int>& nums, int target) {
        sort(nums.begin(), nums.end());
        int ans = nums[0]+nums[1]+nums[2], n = nums.size();
        for(int i = 0; i < n; i ++){
            int l = i+1, r = n-1;
            while(l<r){
                int sum = nums[l]+nums[r]+nums[i];
                if(abs(sum-target)<abs(ans-target)) ans = sum;
                if(sum>target) r --;
                else if(sum<target) l ++;
                else return ans;
            }
        }
        return ans;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值