LeetCode刷题笔记
10.24题目
258各位相加
题目描述:
给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。返回这个结果。
示例 1:
输入: num = 38
输出: 2
解释: 各位相加的过程为:
38 --> 3 + 8 --> 11
11 --> 1 + 1 --> 2
由于 2 是一位数,所以返回 2。
示例 2:
输入: num = 0
输出: 0
提示:
0 <= num <= 231 - 1
①使用循环:
方法一:通过转化整型为字符串,再转换回来,来进行运算
class Solution {
public:int addDigits(int num) {int a = num;while(a>=10){int sum = 0;string b = to_string(a);for(int i = 0;i<b.size();i++){sum += (b[i] - '0');}a = sum;}return a;}
};
方法二:通过取模,得到数字再相加
class Solution {
public:int addDigits(int num) {while(num >= 10) {int sum = 0;while(num > 0) {sum += num % 10;num /= 10;}num = sum;}return num;}
};
②不使用循环,通过找到数学规律来得到结果
class Solution {
public:int addDigits(int num) {return 1 + (num - 1) % 9;}
};
为什么这样写?
以数字 abc为例:
abc = 100a + 10b + c
各位和 = a + b + c
差值 = (100a + 10b + c) - (a + b + c)= 99a + 9b= 9 × (11a + b) ← 这是9的倍数
因此可以直接取mod 9,不过9本身就会变成0,要保留9本身,所以通过(num-1)保证9不被模掉,又通过+1恢复它本身。
