[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?
題目解析:
主要考察整數(shù)各個(gè)位數(shù)求和,當(dāng)且僅當(dāng)和小于10時(shí)輸出。可能會(huì)走入整數(shù)轉(zhuǎn)換為字符串的誤區(qū),直接使用取余(%)個(gè)位數(shù)相加即可,需要注意:
? ? ? ? 1.非負(fù)整數(shù)判斷
? ? ? ? 2.輸入0時(shí)輸出0,輸入10時(shí)輸出1
? ? ? ? 3.至于O(1)時(shí)間復(fù)雜度考察數(shù)學(xué)公式:1 + (num-1) % 9
? ? ? ? 4.整數(shù)轉(zhuǎn)換字符串可以類似思想:循環(huán)個(gè)位數(shù)轉(zhuǎn)換reslut=num%10,num=num/10
我的代碼:
public class Solution { public int addDigits(int num) { return 1 + (num-1) % 9; } } 題目筆記:
Roman to Integer 羅馬數(shù)字轉(zhuǎn)換考察switch和數(shù)字各個(gè)位數(shù)轉(zhuǎn)換
int getNumToInt(char ch) {//此題需要注意switch寫法和羅馬數(shù)字計(jì)算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"}如果當(dāng)前處理的字符對(duì)應(yīng)的值和上一個(gè)字符一樣,那么臨時(shí)變量加上這個(gè)字符。比如III = 3如果當(dāng)前比前一個(gè)大,說(shuō)明這一段的值應(yīng)該是當(dāng)前這個(gè)值減去前面記錄下的臨時(shí)變量中的值。比如IIV = 5 – 2如果當(dāng)前比前一個(gè)小,那么就可以先將臨時(shí)變量的值加到結(jié)果中,然后開始下一段記錄。比如VI = 5 + 1DCXXI=500+100+10+10+1=621*/int length;int i,j;int result; //結(jié)果int last; //前一個(gè)值int curr; //當(dāng)前值int num; //臨時(shí)變量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:我代碼的缺點(diǎn)包括:我喜歡過(guò)于復(fù)雜的注釋,而直觀的代碼好于注釋;代碼中的臨時(shí)變量轉(zhuǎn)換過(guò)多,需要更精簡(jiǎn);字符串?dāng)?shù)組操作習(xí)慣計(jì)算長(zhǎng)度后s[i],而不是使用*s。
(By:Eastmount 2015-9-8 下午6點(diǎn)半? ?http://blog.csdn.net/eastmount/)
總結(jié)
以上是生活随笔為你收集整理的[LeetCode] Add Digits - 数字各个位数求和的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: [LeetCode] Length of
- 下一篇: [LeetCode] Binary Tr