栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

1进制转换算法:《算法零基础100讲》

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

1进制转换算法:《算法零基础100讲》

题目1️⃣:

二进制中1的个数

分析:位运算复习:若n&1=1,则n二进制表示的最后一位为1️⃣,反之为0️⃣

class Solution {
public:
    int hammingWeight(uint32_t n) { 
    int ret=0;
    while(n){
       ret+=n&1;  //ret加n最后一位
       n>>=1;     //位运算,n右移,去掉最后一位
       } 
    return ret;  //输出结果
    }
};

 题目2️⃣:

各位相加

 分析:标准模板题,循环即可

class Solution {
public:
    int addDigits(int num) {
     while(num>=10){  
         int k=0;
         int x=num;  //用x来做num的替身
         while(x){
             k+=(x%10);
             x/=10;
         }
         num=k;  //更新num的值为k
     }
     return num;
    }
};

数学优化(力扣高手题解):

return (num-1)%9+1; //也可直接(num%9),当num为9的倍数时特判即可(不要0)

题目3️⃣:

二进制链表转整数

分析:关键是数据结构-链表的理解:单向链表中的每个 结点连着下一个结点,只有要访问某个结点的元素,必先访问其前一个结点。

结点总数不超过30,说明不会溢出。

class Solution {
public:
    int getDecimalValue(ListNode* head) {
    ListNode* k=head;       //从头结点访问
    int tmp=0;
    for(;k!=nullptr;){     
        tmp=tmp*2+k->val;  
        k=k->next;          //k划到下一个结点
    }
    return tmp;
    }
};

题目4️⃣:

k进制表示下的各位数字之和

分析:一般的进制转化而已啦

class Solution {
public:
int sum=0;
string c="0123456789";  //k范围为0~9,设置字符串c
void f(int a,int b){
    if(a/b)f(a/b,b);
    sum+=int(c[a%b]-'0');  //模拟进制转化操作,sum通过递归加上转化后的各位
}
    int sumbase(int n, int k) {
    f(n,k);
    return sum;
    }
};

题目5️⃣:

统计最大组的数目

分析:统计,意味着可能需要查找,而用单一的数组查找比较困难,所以很自然的想到哈希表

现在的我也只会哈希表,一个键值为某数的位数和,哈希值为该位数和出现的次数。

当然,也可以嵌套两个数组外面的数组用来计数,里面的用来记所有可能的key,这就很造成空间的损失

class Solution {
public:
    int countLargestGroup(int n) {
    unordered_maphashtable;
    int maxval=INT_MIN,cnt=0;
    for(int i=1;i<=n;i++){
        int key=0,io=i;   //用io代替i
        while(io){
            key+=io%10;
            io/=10;
            }              //局部变量key记录位数和
        hashtable[key]++;
        maxval=max(hashtable[key],maxval);//更新最大位数和
    }
    for(pair i:hashtable){  //遍历哈希表
    if(i.second==maxval)cnt++;
    }
    return cnt;
    }
};

 接下来的例题超简单(套用模板即可):

七进制数

class Solution {
public:
string c="0123456";
    string convertTobase7(int num) {
    if(num==0)return "0";
    bool i=0;
    string res="";
    if(num<0){num*=-1;i=1;}      //对0和负数特殊处理
    while(num){
        res+=c[num%7];      
        num/=7;                 //从低位往高位转化
    }
    if(i)res+="-";
    reverse(res.begin(),res.end());  //翻转
    return res;
    }
};

题目7️⃣:

又是位运算的使用(补码反码原码要弄清)

数字转换为十六进制数

class Solution {
public:
string c="0123456789abcdef";
    string toHex(unsigned num) {
        string res;
        res=c[num&15];   //位运算,num&15=num%16
        while(num>>=4){  //num>>=4即num/=16;
         res=c[num&15]+res;
        }
        return res;
    }
};

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/443874.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号