[解题报告](第19讲) 进制转换(一) - 入门

主要目录


零、写在前面

         这是打卡的第十九天,今天题目比较简单,就是题量巨大,,主要知识点在

《算法零基础100讲》(第19讲) 进制转换(一) - 入门https://blog.csdn.net/WhereIsHeroFrom/article/details/120875977https://blog.csdn.net/WhereIsHeroFrom/article/details/120875977

一、主要知识点

        1.十进制转7进制

        其实主要方法就是除留余数法则。

    while(n){
        ans += n % k;    //取余数
        n /= k;        //除k
    }

二、课后习题 

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

剑指 Offer 15. 二进制中1的个数https://leetcode-cn.com/problems/er-jin-zhi-zhong-1de-ge-shu-lcof/

主要思想

按照位运算,从1到32位进行扫描就好了。

int hammingWeight(uint32_t n) {
    int count = 0;
    for(int i = 0;i < 32;i++)            //位移统计1个数
        if(n & ((uint32_t)1 << i))    count++;    //1要转换类型 不然默认位int会溢出
    return count;
}

结果分析

结果还是极好的


258. 各位相加

258. 各位相加https://leetcode-cn.com/problems/add-digits/

主要思想

利用除留余数法得到10进制的各个和,反复执行直到小于10就好了。

int addDigits(int num){
    int ans = num;        //结果
    while(ans/10){        //和ans < 10没有本质区别
        num = ans;        //num赋值位之前的结果
        ans = 0;            //ans初始化
        while(num){        //统计num中各位和
            ans += num % 10;
            num /= 10;
        }
    }
    return ans;
}

结果分析

凑合,还行。


1290. 二进制链表转整数

1290. 二进制链表转整数https://leetcode-cn.com/problems/convert-binary-number-in-a-linked-list-to-integer/

主要思想

每次乘2做加法就好了,有点像2分快速幂的感觉。代码不难,直接看吧。

int getDecimalValue(struct ListNode* head){
    int sum = 0;
    for( ; head; head = head -> next){    //遍历链表
        sum += head-> val;                //加入此节点
        sum *= 2;                          //作位移
    }
    return sum / 2;                //其实先做位移就不需要这个了,期待你们优化
}

结果分析

还行吧。


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

1837. K 进制表示下的各位数字总和https://leetcode-cn.com/problems/sum-of-digits-in-base-k/

主要思想

和上面的某道题没啥区别。

int sumBase(int n, int k){
    int ans = 0;
    while(n){            //除留余数法
        ans += n % k;    
        n /= k;
    }
    return ans;
}

结果分析

可以了


1399. 统计最大组的数目

1399. 统计最大组的数目https://leetcode-cn.com/problems/count-largest-group/

主要思想

利用hash表存储所有和的值对应元素个数,顺带统计最大值,返回就好了

int countLargestGroup(int n){
    int f[37] = {0},max=0;        //记录最大值、记录相应和的数目hash表
    for(int i = 1;i <= n; i++){    //从1到n做统计
        int count = 0,temp = i;    //统计个数初始化
            while(temp){           //除留余数法
                count += temp%10;
                temp /= 10;
            }
            f[count]++;            //相应的值+1
            if(f[count] > max) max = f[count];//更新max值
    }
    int ans = 0;                    //判断最终的答案
    for(int i = 0;i < 37;i++){
        if(f[i] == max) ans++;        //看看等于max的有几个
    }
    return ans;
}

结果分析

 简洁,完美


504. 七进制数

504. 七进制数https://leetcode-cn.com/problems/base-7/

主要思想

转换为7进制数。就用算法求就好了,但是要注意负数的处理,个人觉得没必要用fabs,小于0的时候增加负号的时候顺带把值取-n就好了呗。

char * convertToBase7(int num){
    char *s = malloc(sizeof(char) * 15);    //申请空间
    int stack[15];                            //利用栈反转数组
    int count = 0,countnum = 0;
    if(num == 0) s[count++] = '0';        //0的处理
    if(num < 0){                    //负值的处理
        s[count++] = '-';        //插入符号
        num = -num;            //取反
    }
    while(num){                        
        stack[countnum++] = num % 7;    //入栈
        num /= 7;                    //除留余数
    }
    int i = countnum;            //栈的统计量
    while(i--){
        s[count++] = stack[--countnum] + '0';//出栈入数组
    }
    s[count] = 0;    //将最后的值置为0表示结束 上面是count++,所以count是大了1的这里不用+1
    return s;
}

结果分析

凑合


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

405. 数字转换为十六进制数https://leetcode-cn.com/problems/convert-a-number-to-hexadecimal/

主要思想

直接强制变成unsigned 就直接打印反码了,小技巧把。

char * toHex(int num){
    char s[16] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};//16进制表示
    char *ans = malloc(sizeof(char) * 9);//返回的要malloc或者选择全局变量,但是还是malloc比较好
    int count = 0,stack[8],countnum = 0;//利用栈反序
    if(num == 0) ans[count++] = '0';    //0的特殊判定
    unsigned int a = num;                //直接做强转可以用位移
    while(a){
        stack[countnum++] = a % 16;        //入栈
        a /= 16;
    }
    while(countnum){                
        ans[count++] = s[stack[--countnum]];    //出栈入数组
    }
    ans[count] = 0;            //标记结束

    return ans;
}

结果分析

  还行


三、今日总结

有点卷不动了。还有论文没写,神经网络好难。。。。还有今晚的presentation ,祝我顺利把-.-

猜你喜欢

转载自blog.csdn.net/qq_17593855/article/details/121213164