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.
拿到题目首先想到的就是利用循环解决问题。js中见过类似问题,先用JavaScript来解决。
解法一:
/**
* @param {number} num
* @return {number}
*/
var addDigits = function(num) {
var digitsString = num + "";
var str = digitsString.split("");
while(str.length != 1){
var a = 0;
for(var i = 0; i < str.length; i++){
a += parseInt(str[i]);
}
str = a.toString().split("");
}
return parseInt(str[0]);
};
利用类似的思想,用Java代码实现:
public class Solution {
public int addDigits(int num) {
String digitsString = num + "";
String str[] = digitsString.split("");
while(str.length != 1){
int a = 0;
for(int i = 0; i < str.length; i++){
a += Integer.parseInt(str[i]);
}
digitsString = a + "";
str = digitsString.split("");
}
return Integer.parseInt(str[0]);
}
}
总结
1.总结Java中的parseInt方法属于Integer对象,可以有一个或两个参数,返回一个基本数据类型int。类似的方法还有Double.parseDouble()等。
2.split()函数用于按字符来切割字符串,并返回一个数组。以下转自JavaScript split() 方法-w3school
stringObject.split(separator,howmany)参数描述
separator 必需。字符串或正则表达式,从该参数指定的地方分割 stringObject。
howmany 可选。该参数可指定返回的数组的最大长度。如果设置了该参数,返回的子串不会多于这个参数指定的数组。如果没有设置该参数,整个字符串都会被分割,不考虑它的长度。
如果把空字符串 ("") 用作 separator ,那么 stringObject 中的每个字符之间都会被分割。
也使用正则表达式作为 separator:
解法二:
转换为字符串的操作略显复杂,可以直接对数据操作:
public class Solution {
public int addDigits(int num) {
/*
解法一
*/
// String digitsString = num + "";
// String str[] = digitsString.split("");
// while(str.length != 1){
// int a = 0;
// for(int i = 0; i < str.length; i++){
// a += Integer.parseInt(str[i]);
// }
// digitsString = a + "";
// str = digitsString.split("");
// }
// return Integer.parseInt(str[0]);
/*
解法二
*/
while(num >= 10){
num = (num / 10) + (num % 10);
}
return num;
}
}
这种解法简单易懂,不做赘述。
解法三:
此题还有一个follow up:
Follow up:
Could you do it without any loop/recursion in O(1) runtime?
并给出了一些提示:可以参考Digital root-Wikipedia
任何数字的题目都是有规律可循的,
public class Solution {
public int addDigits(int num) {
/*
解法一
*/
// String digitsString = num + "";
// String str[] = digitsString.split("");
// while(str.length != 1){
// int a = 0;
// for(int i = 0; i < str.length; i++){
// a += Integer.parseInt(str[i]);
// }
// digitsString = a + "";
// str = digitsString.split("");
// }
// return Integer.parseInt(str[0]);
/*
解法二
*/
// while(num >= 10){
// num = (num / 10) + (num % 10);
// }
// return num;
/*
解法三
*/
return 1 + (num-1)%9;
}
}