力扣·进制转换

剑指 Offer 15. 二进制中1的个数

题目链接

枚举每一个数位
class Solution {
public:
    int hammingWeight(uint32_t n) {
        int cnt=0;
        while(n)
        {
            if(n&1) cnt++;
            n>>=1;
        }
        return cnt;
    }
};

258. 各位相加

题目链接

暴力循环

取出每一个数位,然后一直求数位和,直到是个位数返回

class Solution {
public:
    int addDigits(int num) {
        int sum=0;
        while(1)
        {
            while(num)
            {
                sum+=num%10;
                num/=10;
            }
            if(sum/10==0) return sum;
            num=sum;
            sum=0;
        }
    }
};
原地算法

在这里插入图片描述
观察可以得到除0以外其他数字的数位和都是对应十进制数字对9取余的结果(9的倍数是9)

class Solution {
public:
    int addDigits(int num) {
        return (num-1)%9+1;
    }
};

1290. 二进制链表转整数

题目链接

遍历链表
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    int getDecimalValue(ListNode* head) {
        int sum=0;
        ListNode* p=head;
        while(p!=NULL)
        {
            sum=sum*2+p->val;
            p=p->next;
        }
        return sum;
    }
};

1837. K 进制表示下的各位数字总和

题目链接

短除法一直取余
class Solution {
public:
    int sumBase(int n, int k) {
        int sum=0;
        while(n)
        {
            sum+=n%k;
            n/=k;
        }
        return sum;
    }
};

1399. 统计最大组的数目

题目链接

暴力

算一下时间来证明其可行,在这里只计算最慢的双层循环部分。n得最大值是10000,也就是说外层循环最多有10000次,数字位数最大有五位,所以计算次数不会超过50000次(且不说五位数只有一个)

class Solution {
public:
    int countLargestGroup(int n) {
        unordered_map<int,int>mp;
        for(int i=1;i<=n;i++)
        {
            int j=i;
            int sum=0;
            while(j)
            {
                sum+=j%10;
                j/=10;
            }
            mp[sum]++;
        }
        int maxn=0;
        for(auto t:mp) maxn=max(maxn,t.second);
        int cnt=0;
        for(auto t:mp) if(t.second==maxn) cnt++;
        return cnt;
    }
};

504. 七进制数

题目链接

短除法
class Solution {
public:
    string convertToBase7(int num) {
        if(num==0) return "0";
        int k=0;
        if(num<0) 
        {
            k=1;
            num=-num;
        }
        string ch;
        while(num)
        {
            ch=(char)(num%7+'0')+ch;
            num/=7;
        }
        if(k) ch='-'+ch;
        return ch;
    }
};

405. 数字转换为十六进制数

题目链接

短除法

和上一题一样就是除呗,因为十六进制里面有字母,所以建立一个他们的对应关系。这道题还有一个比较恶心的点,就是它里面有负数。(补码反码的知识自行百度)1的十六进制是ffffffff,而比他更小的负数n的十六进制其实是ffffffff减去 − 1 − n -1-n 1n的十六进制。举个例子,-3的十六进制是ffffffff减去(-1-(-3))的十六进制所以是fffffffd。发现了这一点我们就可以直接给所有附属加上一个偏移量1<<32了

class Solution {
public:
    string toHex(int num) {
        long res=num;
        if(num==0) return "0";
        if(num<0) res+=1ll<<32;
        unordered_map<int,char>mp;
        for(int i=0;i<=9;i++) mp[i]=i+'0';
        for(int i=10;i<=15;i++) mp[i]=i-10+'a';
        string ch;
        while(res)
        {
            ch=mp[res%16]+ch;
            res/=16;
        }
        return ch;
    }
};
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学习算法的小菜鸡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值