我是靠谱客的博主 拼搏学姐,最近开发中收集的这篇文章主要介绍力扣·进制转换,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章目录

    • 剑指 Offer 15. 二进制中1的个数
        • 枚举每一个数位
    • 258. 各位相加
        • 暴力循环
        • 原地算法
    • 1290. 二进制链表转整数
        • 遍历链表
    • 1837. K 进制表示下的各位数字总和
        • 短除法一直取余
    • 1399. 统计最大组的数目
        • 暴力
    • 504. 七进制数
        • 短除法
    • 405. 数字转换为十六进制数
        • 短除法

剑指 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;
    }
};

最后

以上就是拼搏学姐为你收集整理的力扣·进制转换的全部内容,希望文章能够帮你解决力扣·进制转换所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(56)

评论列表共有 0 条评论

立即
投稿
返回
顶部