[TOC]

​ 本文主要记录进制转换与数位分离的相关LeetCode题目的实现代码,直接给出本文各个题目的答案,供有需求的读者学习或复制。

一、进制转换的LeetCode题目

1、二进制转换的题目

1290. 二进制链表转整数(简单难度)

class Solution {
public:
    // 二进制转十进制
    int getDecimalValue(ListNode* head) {
        vector<int> arr;
        // 将链表元素加入数组中
        ListNode* p=head;
        while(p){
            arr.push_back(p->val);
            p=p->next;
        }
        // 二进制转换为十进制
        int n=arr.size();
        int k=1;
        int sum=0;
        for(int i=n-1;i>=0;i--){
            sum+=arr[i]*k;
            k*=2;
        }
        return sum;
    }
};

191. 位1的个数(简单难度)

剑指 Offer 15. 二进制中1的个数(简单难度)

class Solution {
public:
    int hammingWeight(uint32_t n) {
        string res;
        if(n==0) res="0";
        while(n>0){
            res=to_string(n%2)+res;
            n=n/2;
        }
        int num=0;
        for(char c:res){
            if(c=='1') num++;
        }
        return num;
    }
};

338. 比特位计数(简单难度)

剑指 Offer II 003. 前 n 个数字二进制中 1 的个数(简单难度)

class Solution {
public:
    // 十进制转换为2二进制
    string ten2k(int num,int k=2){
        if(num==0) return "0";
        string ans;
        while(num){
            ans= to_string(num%k)+ans;
            num/=k;
        }
        return ans;
    }
    vector<int> countBits(int n) {
        vector<int> res;
        for(int i=0;i<=n;i++){
            string bits=ten2k(i);//二进制的字符串
            int num=0;//统计字符串中1的个数
            for(int j=0;j<bits.length();j++){
                if(bits[j]=='1') num++;
            }
            res.push_back(num);
        }
        return res;
    }
};

693. 交替位二进制数(简单难度)

class Solution {
public:
    string ten2k(int n,int k=2){
        if(n==0) return "0";
        string res;
        while(n>0){
            res=to_string(n%k)+res;
            n=n/k;
        }
        return res;
    }
    bool hasAlternatingBits(int n) {
        string kbit=ten2k(n);
        char flag='0';
        for(int i=1;i<kbit.length();i++){
            if(kbit[i]==kbit[i-1]) return false;
        }
        return true;
    }
};

1009. 十进制整数的反码(简单难度)

476. 数字的补数(简单难度)

class Solution {
public:
    string ten2k(int n,int k=2){
        if(n==0) return "0";
        string res;
        while(n>0){
            res=to_string(n%k)+res;
            n=n/k;
        }
        return res;
    }
    int k2ten(string n,int k=2){
        int sum=0;
        long a=1;// 注意,必须为整型
        for(int i=n.length()-1;i>=0;i--){
            sum+=(n[i]-'0')*a;
            a*=k;
        }
        return sum;
    }
    int bitwiseComplement(int num) {
        string kbit = ten2k(num);//10进制转换为二进制
        string res="";
        for(char c:kbit){
            if(c=='1'){
                res+='0';
            }
            else {
                res+='1';
            }
        }
        int n=k2ten(res);
        return n;
    }
};

504. 七进制数(简单难度)

class Solution {
public:
    string convertToBase7(int num) {
        if(num==0) return "0";
        string res;
        // 处理正数
        int tempNum=abs(num);//如果num为负数,变为正数
        while(tempNum>0){
            res=to_string(tempNum%7)+res;
            tempNum=tempNum/7;
        }
        if(num<0) res.insert(res.begin(),'-');
        return res;
    }
};

405. 数字转换为十六进制数(简单难度)

class Solution {
public:
    string toHex(int n) {
        if(n==0) return "0";
        unsigned num = n;//转换为无符号
        string res;
        while(num>0){
            int base=num%16;
            char c='0';
            if(base>9) {
                c=base-10+'a';
            }else{
                c=base+'0';
            }
            res+=c;
            num=num/16;
        }
        reverse(res.begin(),res.end());
        return res;
    }
};

171. Excel 表列序号(简单难度)

​ 这道题要求将Excel 表中的26个的由大写字母组成的列名称转换成相对应的列序号,因此本质就是一道26进制转换为10进制的题目,但是这道题与标准的进制转换(0-25)不同,因为Excel表的列序号是1到26,需要特殊处理。

class Solution {
public:
    int titleToNumber(string columnTitle) {
        int sum=0;
        long k=1;//幂,幂要设置为long
        for(int i=columnTitle.length()-1;i>=0;i--){
            sum+=(columnTitle[i]-'A'+1)*k;
            k*=26;
        }
        return sum;
    }
};

168. Excel表列名称(简单难度)

class Solution {
public:
    string convertToTitle(int n) {
        // 10进制转26进制的模板,正常26进制是0-25,该题是1-26,
        string res="";
        while(n>0){
            --n;//每一位都多了1,此处-1使其可以用正常的26进制代码处理
            res+=n%26+'A';//将数字字符转换为大写字母字符,'A'是65,'0'是48
            n=n/26;
        } 
        reverse(res.begin(),res.end());//反转序列
        return res;
    }
};

2、数位分离

1281. 整数的各位积和之差(简单难度)

class Solution {
public:
    int subtractProductAndSum(int n) {
        int sum=0;
        int x=1;
        while(n>0){
            sum+=n%10;
            x*=n%10;
            n=n/10;
        }
        return x-sum;
    }
};

258. 各位相加(简单难度)

class Solution {
public:
    int addDigits(int num) {
        while(num>=10)// 大于等于1位数
        {
            int sum=0;
            while(num>0){
                sum+=num%10;
                num=num/10;
            };
            num=sum;
        }
        return num;
    }
};

1945. 字符串转化后的各位数字之和(简单难度)

class Solution {
public:
    int getLucky(string s, int k) {
        // 转换成数字
        string str="";
        for(int i=0;i<s.length();i++){
            int num=s[i]-'0'-48;
            str+=to_string(num);
        }
        // 重复转换操作k次
        int sum=0;
        while(k)// 
        {
            sum=0;
            for(int i=0;i<str.length();i++){
                sum+=str[i]-'0';
            }
            str=to_string(sum);
            k--;
        }
        return sum;
    }
};

1837. K 进制表示下的各位数字总和(简单难度)

class Solution {
public:
    int sumBase(int n, int k) {
        // 从10进制转换为k进制
        string kbits="";
        if(n==0) kbits="0";
        while(n>0){
            kbits=to_string(n%k)+kbits;
            n=n/k;
        }
        // 各位累和
        int sum=0;
        for(char c:kbits) sum+=c-'0';
        return sum;
    }
};

9. 回文数(简单难度)

class Solution {
public:
    bool isPalindrome(int x) {
        //0是回文数
        if(x==0){
            return true;
        }
        //负数不是回文数
        if(x<0){
            return false;
        }
        //正数进行数位分离
        vector<int> arr;
        while(x>0){
            arr.push_back(x%10);
            x = x/10;
        }
        // 双指针遍历
        for(int i=0,j=arr.size()-1;i<j;i++,j--){
            if(arr[i]!=arr[j]){
                return false;
            }
        }
        return true;
    }
};