[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
我的代碼:
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 + 1DCXXI=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] Add Digits - 数字各个位数求和的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [LeetCode] Length of
- 下一篇: [LeetCode] Binary Tr