《解题报告》(第19讲) 进制转换(一) – 入门

由于进来的晚,前面的算法虽然都补卡了,但是解题报告还没有写完,doing中

《算法零基础100讲》(第19讲) 进制转换(一) - 入门_英雄哪里出来-CSDN博客

 剑指 Offer 15. 二进制中1的个数 - 力扣(LeetCode) (leetcode-cn.com)

编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数(也被称为 汉明重量).)。

示例 1:

输入:n = 11 (控制台输入 00000000000000000000000000001011)
输出:3
解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 '1'。

示例 2:

输入:n = 128 (控制台输入 00000000000000000000000010000000)
输出:1
解释:输入的二进制串 00000000000000000000000010000000 中,共有一位为 '1'。

示例 3:

输入:n = 4294967293 (控制台输入 11111111111111111111111111111101,部分语言中 n = -3)
输出:31
解释:输入的二进制串 11111111111111111111111111111101 中,共有 31 位为 '1'。
 

 由于本题输入的全是二进制,所以位运算应该更简便

class Solution {
public:
    int hammingWeight(uint32_t n) {
        int count=0;
        while(n)//条件,n>0,由计算机系统知识与运算可知,把一个整数-1再和原整数做与运算会使最右边的一个1变成0,只需要加一个计数器来计数了
        {
            n&=(n-1);//先相与再赋值
            count++;//计数器
        }
        return count;
    }
};

也许上面的与运算并不是很清晰,下面我将用草纸写出

258. 各位相加 - 力扣(LeetCode) (leetcode-cn.com)

简单的短除取余

给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。

示例:

输入: 38
输出: 2 
解释: 各位相加的过程为:3 + 8 = 11, 1 + 1 = 2。 由于 2 是一位数,所以返回 2。

1837. K 进制表示下的各位数字总和 - 力扣(LeetCode) (leetcode-cn.com)

给你一个整数 n(10 进制)和一个基数 k ,请你将 n 从 10 进制表示转换为 k 进制表示,计算并返回转换后各位数字的 总和 。

转换后,各位数字应当视作是 10 进制数字,且它们的总和也应当按 10 进制表示返回。

class Solution {
public:
    int addDigits(int num) {//用递归做

        if(num / 10 == 0) // 特殊情况一位数
        {
            return num;
        }

        // 拆分成多个数相加
        int sum = 0;
        while(num)
        {
            sum += num % 10;//拆分并加和
            num /= 10;
        }

        return addDigits(sum);递归
    }
};

示例 1:

输入:n = 34, k = 6
输出:9
解释:34 (10 进制) 在 6 进制下表示为 54 。5 + 4 = 9 。

示例 2:

输入:n = 10, k = 10
输出:1
解释:n 本身就是 10 进制。 1 + 0 = 1 。
 

简单的短除法

class Solution {
public:
    int sumBase(int n, int k) {//
        int sum = 0 ;//计算和
        while(n){//短除法
            sum += n % k;//求几进制就除几取余
            n /= k;
        }
        return sum;
    }
};

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>