[LeetCode] 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.
Follow up:
Could you do it without any loop/recursion in O(1) runtime?

题目解析:
主要考察整数各个位数求和,当且仅当和小于10时输出。可能会走入整数转换为字符串的误区,直接使用取余(%)个位数相加即可,需要注意:
        1.非负整数判断
        2.输入0时输出0,输入10时输出1
        3.至于O(1)时间复杂度考察数学公式:1 + (num-1) % 9
        4.整数转换字符串可以类似思想:循环个位数转换reslut=num%10,num=num/10

我的代码:

int addDigits(int num) {
    int result;
    //负数跳出
    if(num<=0) return 0;
    if(num<10) return num;
    result=num;
    while(result>=10)
    {
        num=result;
        result=0;
        while(num>=10) {       //计算数字和
            result+=num%10;    //个位
            num=num/10;
        }
        result+=num;
    }
    return result;
}
推荐代码:
public class Solution {  
    public int addDigits(int num) {  
        return 1 + (num-1) % 9;  
    }  
}  
题目笔记:
Roman to Integer 罗马数字转换考察switch和数字各个位数转换

int getNumToInt(char ch) {
    //此题需要注意switch写法和罗马数字计算
    switch(ch) {
        case 'I': return 1;   
        case 'V': return 5;  
        case 'X': return 10;  
        case 'L': return 50;  
        case 'C': return 100;  
        case 'D': return 500;  
        case 'M': return 1000;  
        default: return 0; 
    }
    return 0;
}

int romanToInt(char* s) {
    /*
     1~9: {"I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"}
     10~90: {"X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"}
     100~900: {"C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"}
     1000~3000: {"M", "MM", "MMM"}
     如果当前处理的字符对应的值和上一个字符一样,那么临时变量加上这个字符。比如III = 3
     如果当前比前一个大,说明这一段的值应该是当前这个值减去前面记录下的临时变量中的值。比如IIV = 5 – 2
     如果当前比前一个小,那么就可以先将临时变量的值加到结果中,然后开始下一段记录。比如VI = 5 + 1
     DCXXI=500+100+10+10+1=621
    */
    int length;
    int i,j;
    int result;          //结果
    int last;            //前一个值
    int curr;            //当前值
    int num;             //临时变量
    length  = strlen(s);
    last = getNumToInt(s[0]);
    num = last;
    for(i=1; i<length; i++) {
        curr = getNumToInt(s[i]);
        if(curr == last) { 
            num += curr;
        }
        else if(curr < last) {
            result += num;
            num = curr;
        }
        else if(curr > last) {
            num = curr - num;
        }
        last = curr;        
    }
    result += num;
    return result;
}

PS:我代码的缺点包括:我喜欢过于复杂的注释,而直观的代码好于注释;代码中的临时变量转换过多,需要更精简;字符串数组操作习惯计算长度后s[i],而不是使用*s。

(By:Eastmount 2015-9-8 下午6点半   http://blog.csdn.net/eastmount/)

目录
相关文章
【LeetCode-每日一题】-67. 二进制求和
【LeetCode-每日一题】-67. 二进制求和
|
6月前
【LeetCode】1171. 从链表中删去总和值为零的连续节点、面试题 02.05. 链表求和
目录 1171. 从链表中删去总和值为零的连续节点 面试题 02.05. 链表求和
32 0
|
6月前
|
人工智能 BI 索引
【Leetcode -598.范围求和Ⅱ -599.两个列表的最小索引总和】
【Leetcode -598.范围求和Ⅱ -599.两个列表的最小索引总和】
24 0
|
5月前
Leetcode 623. Add One Row to Tree
题目很简单,在树的第d层加一层,值为v。递归增加一层就好了。代码如下
23 0
|
7月前
leetcode:67. 二进制求和
函数原型: char * addBinary(char * a, char * b)
27 0
|
7月前
|
存储 C++ Python
LeetCode刷题---Add Two Numbers(一)
LeetCode刷题---Add Two Numbers(一)
|
10月前
|
存储 算法 安全
LeetCode - #2 Add Two Numbers
我们社区从本期开始会将顾毅(Netflix 增长黑客,《iOS 面试之道》作者,ACE 职业健身教练。)的 Swift 算法题题解整理为文字版以方便大家学习与阅读。 不积跬步,无以至千里;不积小流,无以成江海,Swift社区 伴你前行。
LeetCode - #2 Add Two Numbers
|
10月前
|
Java API Python
leetcode:67.二进制求和
简单题,不要用api…思路就是从最低位开始相加,遇2进1即可。
49 0
|
11月前
|
算法 C++ Python
每日算法系列【LeetCode 829】连续整数求和
每日算法系列【LeetCode 829】连续整数求和
|
11月前
|
算法 C++ Python
每日算法系列【LeetCode 357】计算各个位数不同的数字个数
每日算法系列【LeetCode 357】计算各个位数不同的数字个数