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 = 111 + 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;
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值