剑指offer系列(十七)求1+2+3+...+n,不用加减乘除做加法,把字符串转换成整数

求1+2+3+...+n

题目描述

求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。

解题思路:

法一:利用python的特性

法二:用两个函数,一个递归,另一个终止递归。如果对n连续进行两次反运算,那么非零的n转换为True,0转换为False。

利用这一特性终止递归,注意考虑测试用例为0的情况。

代码:

法一:

# -*- coding:utf-8 -*-
class Solution:
    def Sum_Solution(self, n):
        # write code here
        return sum(list(range(1, n+1)))

法二:

# -*- coding:utf-8 -*-
class Solution:
    def Sum_Solution(self, n):
        # write code here
        return self.sum(n)
    
    def sum0(self, n):
        return 0
    
    def sum(self, n):
        fun ={False: self.sum0, True: self.sum}
        return n+fun[not not n](n-1)

不用加减乘除做加法

题目描述

写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。

解题思路:

法一:用sum函数,但是特别注意sum()求和里面是个[]列表对象,直接输入num,num2是不行的

扫描二维码关注公众号,回复: 3611328 查看本文章

法二:(超时

# -*- coding:utf-8 -*-
class Solution:
    def Add(self, num1, num2):
        # write code here
        while num2:
            sum = num1^num2
            carray = (num1 & num2)<<1
            #&,左移一位。相当于求进位
            num1 = sum
            num2 = carray
        return num1

)

首先看十进制是如何做的: 5+7=12,三步走
        第一步:相加各位的值,不算进位,得到2。
        第二步:计算进位值,得到10. 如果这一步的进位值为0,那么第一步得到的值就是最终结果。

        第三步:重复上述两步,只是相加的值变成上述两步的得到的结果2和10,得到12。

同样我们可以用三步走的方式计算二进制值相加: 5-101,7-111

        第一步:相加各位的值,不算进位,得到010, 二进制每位相加就相当于各位做异或操作,101^111。

        第二步:计算进位值,得到1010,相当于各位做与操作得到101,再向左移一位得到1010,(101&111)<<1。

       第三步重复上述两步, 各位相加 010^1010=1000,进位值为100=(010&1010)<<1。继续重复上述两步:

       1000^100 = 1100,进位值为0,跳出循环,1100为最终结果。

代码:

法一:

# -*- coding:utf-8 -*-
class Solution:
    def Add(self, num1, num2):
        # write code here
        return sum([num1,num2])

法二:

# -*- coding:utf-8 -*-
class Solution:
    def Add(self, num1, num2):
        # write code here
        while num2:
            sum = num1^num2
            carray = (num1 & num2)<<1
            #&,左移一位。相当于求进位
            num1 = sum
            num2 = carray
        return num1

把字符串转换成整数

题目描述

将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0。

输入描述:

输入一个字符串,包括数字字母符号,可以为空

输出描述:

如果是合法的数值表达则返回该数字,否则返回0。

解题思路:

法一:int()函数

法二:做一些一些特殊处理,比如 +123,就不合理,123前面不需要+,但是-123就合理,因为这是个负数

代码:

法一:

# -*- coding:utf-8 -*-
class Solution:
    def StrToInt(self, s):
        # write code here
        try:
            return int(s)
        except:
            return 0

法二:

# -*- coding:utf-8 -*-
class Solution:
    def StrToInt(self, s):
        # write code here
        if not s:
            return 0
        num = []
        numbers = {'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9}
        for i in s:
            if i in numbers.keys():
                num.append(numbers[i])
            elif i == '+':
                continue
            elif i =='-':
                continue
            else:
                return 0
        ans = 0
        for i in num:
            ans = ans*10+i
        if s[0] == '-':
            ans = 0-ans
        return ans

猜你喜欢

转载自blog.csdn.net/weixin_41813772/article/details/82813058
今日推荐