Leetcode -- 258 数位相加

258.

Given a non-negative integer num, repeatedly add all its digits until the result has only one digit.

For example:

Given num = 38, the process is like: 3 + 8 = 111 + 1 = 2. Since 2 has only one digit, return it.

Follow up:
Could you do it without any loop/recursion in O(1) runtime?

思路一:常规思路: 不断取出数字的每一位,求得和,然后将和 递归计算。

class Solution {
public:
    int addDigits(int num) {
        int sum = 0;
        if (num < 10){
            return num;
        }
        while (num > 0){
            sum += num % 10;
            num = num / 10;
        }
        return addDigits(sum);
    }
};

思路二:

一个数,假如设为ABCD,则实际上这个数可以表达为num = A*1000+B*100+C*10+D。

可分解为num = (A+B+C+D) + (999*A+99*B+9*C),因为我们需要求的是A+B+C+D,所以我们可以采用%的方法。

因为(999*A+99*B+9*C)肯定是9的倍数,则 num % 9 = A+B+C+D,如果A+B+C+D>=10,对9取余,可依照刚才的方法继续分析,结果是一样的。

但是,当num = 9时,9 % 9 = 0,不符合题目的要求,所以算法的核心是     result = (num - 1)% 9 + 1

class Solution {
public:
    int addDigits(int num) {
         return (num - 1) % 9 + 1;
    }
};
时间: 2024-12-17 16:48:39

Leetcode -- 258 数位相加的相关文章

leetcode 258. 各位相加 (python)

给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数. 示例: 输入: 38输出: 2 解释: 各位相加的过程为:3 + 8 = 11, 1 + 1 = 2. 由于 2 是一位数,所以返回 2. class Solution: def addDigits(self, num: int) -> int: def hanshu(nums): sum = 0 while(nums>0): ge = nums % 10 sum += ge nums = int(nums / 10) r

leetCode 258 AddDigits

leetcode 258 Add Digits 题目翻译: 给出一个非负整数num,不断地把它所有数字相加,直到最后剩下一个数字. 例如:num=38,计算过程如,3+8=11,1+1=2,所以2就是最后的数字,返回它就可以了. 并且,你能不使用任何循环或者递归,在O(1)的复杂度内完成吗? 解题思路: 时间复杂度规定了在O(1)内完成,不能采用循环或者递归,那么就变成了数学的问题了,必须找到一个类似方程式的函数,带入即可求解.然后,偶然发现对于9的倍数的一个规律:18,27,36,...,81

OJ题:输入一个多位的数字,求各数位相加。

题目内容: 输入一个多位的数字,1求各数位相加. 例如输入12345,则计算1+2+3+4+5=15 输入格式: 一个整数 输出格式: 一个整数 输入样例: 1234567890 输出样例: 45 时间限制:500ms内存限制:32000kb 实现程序: #include <stdio.h> #include <stdlib.h> #include <string.h> int cnt_count(int value) { int count = 0 , cnt = 0

LeetCode:字符串相加【415】

LeetCode:字符串相加[415] 题目描述 给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和. 注意: num1 和num2 的长度都小于 5100.num1 和num2 都只包含数字 0-9.num1 和num2 都不包含任何前导零.你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式. 题目分析 这道题其实很简单,我们要搞清楚手工计算两数之和的流程.两数相加,和如果大于10的话就有进位,进位最高为1,默认为0,该位相加的和应为sum%

LeetCode 两数相加

LeetCode 两数相加 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和. 您可以假设除了数字 0 之外,这两个数都不会以 0 开头. 示例: 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0 -> 8原因:342 + 465 = 807 知识点: strrev(); // 实现字符

258. Add Digits 数位相加到只剩一位数

[抄题]: Given a non-negative integer num, repeatedly add all its digits until the result has only one digit. For example: Given num = 38, the process is like: 3 + 8 = 11, 1 + 1 = 2. Since 2 has only one digit, return it. [暴力解法]: 时间分析: 空间分析: [优化后]: 时间分析

258. Add Digits 入学考试:数位相加

[抄题]: Given a non-negative integer num, repeatedly add all its digits until the result has only one digit. Example: Input: 38 Output: 2 Explanation: The process is like: 3 + 8 = 11, 1 + 1 = 2.   Since 2 has only one digit, return it. [暴力解法]: 时间分析: 空间

LeetCode —— 258

和学长聊天的时候,知道了世界上还有一个叫LeetCode的OJ平台,听说相当不错,我暂时弃了九度OJ,开刷LeetCode. LeetCode最吸引我的地方在于,每一道题都有对应的Discuss,在讨论板块里,有世界各地的优秀程序员发布的解法,可以在里面看到很多优秀的代码,优秀的思想,受益匪浅. 今天分享的题目是题号258 Add Digits 题目的意思很简单,输入一个int型数字num,将num的每个位加起来,重复这个过程,直到结果只有个位数为止,即结果为0-9. 我的第一反应是,写一个循环

Java [Leetcode 258]Add Digits

题目描述: Given a non-negative integer num, repeatedly add all its digits until the result has only one digit. For example: Given num = 38, the process is like: 3 + 8 = 11, 1 + 1 = 2. Since 2 has only one digit, return it. 解题思路: 假设输入的数字是一个5位数字num,则num的各位