概述
给定一个非负整数 num
,反复将各个位上的数字相加,直到结果为一位数。
示例:
输入: 38
输出: 2
解释: 各位相加的过程为:3 + 8 = 11, 1 + 1 = 2。 由于 2是一位数,所以返回 2。
进阶:
你可以不使用循环或者递归,且在 O(1) 时间复杂度内解决这个问题吗?
记:
字符串也可以直接用for循环遍历的,不用专门转成list!!!
# -*- coding:utf-8 -*- class Solution(object): def addDigits(self, num): """ :type num: int :rtype: int """ count = 0 list_num = str(num) # 字符串 # while(len(list_num)): for i in list_num: count += int(i) # print(count) while(count>9): s = str(count) count = 0 for i in s: count += int(i) return count def main(): num = 38 rs = Solution() print(rs.addDigits(num)) if __name__ == '__main__': main()
题目中进阶要求的是,不使用循环递归,在O(1)时间复杂度内解决这个问题。 大概思路是这样:如果num为9的倍数,则结果为9。否则为num%9的余数。至于为什么,不甚清楚。return num and (num % 9 or 9)
这里有一点Python and、or运算的短路逻辑小知识点需要介绍: 短路,在很多语言中都有的特性,在且的情况下,全部为真才为真,因为第一个c是真,所以它无法判断整个表达式是否为真或为假(前后都为真才是真,其中一个为假就是假了),他就会接着进行后面的,所以就是选择了后面的,如果这个条件表达式是或,前面的已经是真了,不需要管后面的是真是假都能证明整个表达式为真,就不会进行后面的,自然会选择前面的,这个东西在很多语言中都有,大致理解就是&&(and)的情况下前面为真进行后面,前面为假不进行后面,||(or)的情况下,前面为真不进行后面,前面为假进行后面。 1.首先,’and’、’or’、’not’的优先级是not>and>or。 2.其次,逻辑运算符and和or也称作断路运算符或者惰性求值:它们的参数从左向右解析,一旦结果可以确定就停止。在and语句中,如果每一个表达式都不假的话,返回最后一个,如果有一个为假,那么返回假。在or语句中,只要有一个表达式不为假,那么返回这个表达式的值,只有所有都为假才返回假。 3.总之,碰到and就往后匹配,直到遇到假或匹配到末尾。碰到or,如果or左边为真则返回左边,如果左边为假,则继续匹配右边的参数。 例子
>>> 1 or 0
1
>>> 0 or 1
1
>>> 7 or 9
7
>>> 1 and 88
88
>>> 0 and 88
0
最后
以上就是漂亮香水为你收集整理的【leetcode】258. 各位相加的全部内容,希望文章能够帮你解决【leetcode】258. 各位相加所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复