求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是不行的
# -*- coding:utf-8 -*-
class Solution:
def Add(self, num1, num2):
# write code here
return sum([num1,num2])
法二:(超时)
首先看十进制是如何做的: 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
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