我是靠谱客的博主 漂亮香水,最近开发中收集的这篇文章主要介绍【leetcode】258. 各位相加,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

给定一个非负整数 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. 各位相加所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(43)

评论列表共有 0 条评论

立即
投稿
返回
顶部