leetcode258 题解

前言

LeetCode 258 题目难度等级,easy(官方给的)。leetcode258

题目描述

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.

挑战:

Could you do it without any loop/recursion in O(1) runtime?

不要使用循环和递归实现,只用O(1)的时间复杂度。(ps:后文会给出leetcode中大神的实现)

大致意思:给出一个整数,计算各位的和,直到计算结果为个位数时,返回该结果。

非递归版解法:

public int addDigits(int num) {

		// 存储每位数的和
		int sum = 0;
		while (num >= 10) {
			// 并不能确定数字会执行多少次,所以一定是使用while 循环,而且一定是两层循环的嵌套,
			// 且这两个嵌套都不知道什么时候执行结束。---while与for循环的区别。
			while (num != 0) {
				int digit = num % 10;
				sum += digit;
				num /= 10;
			}
			num = sum;// 更新num的值
			sum = 0;// 对sum清零,准备存储下一个整数的各位的值
		}

		return num;
	}

解题题眼:

1、当不知道循环执行多少次时,只能使用while循环实现。

2、循环的出口是:当计算后的结果是[0,10)区间内的


递归版解法

public int addDigits(int num) {
		if (num < 10 && num >= 0) {
			return num;
		}
		// 递归实现整数的各位求和
		int sum = sumNumInEachDigit(num, 0);
		return addDigits(sum);
	}

	/**
	 * 递归实现整数的各位求和
	 * 
	 * @param num
	 * @param sum
	 * @return
	 */
	public int sumNumInEachDigit(int num, int sum) {

		if (num == 0) {
			return sum;
		}
		sum += (num % 10);
		return sumNumInEachDigit(num / 10, sum);
	}

递归的基础程序:

	/**
	 * 基础的程序,打印整数的每个数字
	 * 
	 * @param num
	 */
	public void printEachNumInDigit(int num) {
		if (num == 0) {
			return;
		}
		System.out.println(num % 10);
		printEachNumInDigit(num / 10);
	}

题眼:

递归版的解法是基于基础程序修改的。步骤:

1、在能写出使用递归打印每位的数字后,

2、然后再来求个各位上的和,

3、实现上层递归,上层递归出口就是[0,10)区间返回。

LeetCode  discussion 题解:

/**
	 * 大神代码一
	 * 
	 * @param num
	 * @return
	 */
	public int addDigits(int num) {

		return num == 0 ? 0 : (num % 9 == 0 ? 9 : (num % 9));
	}

	/**
	 * 大神代码二
	 * @param num
	 * @return
	 */
	public int addDigits2(int num) {

		return 1 + (num - 1) % 9;
	}

类似题目:

leecode 202 HappyNum

题目归类:数论


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值