python 面试题目嗯哼

1.不用运算符计算加法

    def Add(self, num1, num2):
        # write code here
        l=[]
        l.append(num1)
        l.append(num2)
        return sum(l)
class Solution {
public:
	int Add(int num1, int num2)
	{
		return num2 > 0 ? Add(num1^num2, (num1&num2) << 1) : num1;
	}
};
class Solution: 
    def Add(self, num1, num2):           
        while(num2): 
            num1,num2 = (num1^num2) & 0xFFFFFFFF,((num1&num2)<<1) & 0xFFFFFFFF
        return num1 if num1<=0x7FFFFFFF else ~(num1^0xFFFFFFFF)
思路:
求和过程分为两部:求各位上的值,求进位值。然后将这两个数当作两个加法项递归进行直到进位制为0.7 + 5:
各位值2,进位值10, 下一次分别为120递归结束,结果为12.
这里要按二进制处理,二进制数求各位值是异或:0111 ^ 0101 = 0010,求进位值是与操作再左移一位。(0111 & 0101)<<1=1010.
然后更新两个加法项00101010–》0010^1010=1000, (0010&1010)<<1=0100> (1000 ^ 0100)=1100, (1000& 0100)=0,递归结束,
结果为1100.

2.python实现 -十进制转二进制

def decToBin(dec_value):
    bin_value =''
    if dec_value > 1:
        decToBin(dec_value//2)
    print(dec_value % 2,end = '')

二转十

def bin2dec(string_num):
    return str(int(string_num, 2))

3.二叉树求深度

class TreeNode:
	def __init__(self,x):
		self.val = x
		self.left = None
		self.right = None
def maxDepth(self, root):
        if not root:
            return 0
        left = self.maxDepth(root.left)+1
        right = self.maxDepth(root.right)+1
        return max(left, right)

def minDepth(self, root):
        if root is None
        	return 0
        if root.left is None
        	return self.minDepth(root.right)+1
        if root.right is None
        	return self.minDepth(root.left)+1
        leftDepth=self.minDepth(root.left)+1
        rightDepth=self.minDepth(root.right)+1
        return self.min(leftDepth,rightDepth)

4.不用中间变量交换两个数

a = a+b
b = a-b
a = a-b
a = a^b
b = a^b
a = a^b

5.数组中出现超过数组一半的数字
建立字典 o(n) o(n)

def findnum(self,numbers):
	dict={}
	for num in numbers:
		dict[num] = 1 if num not in dict else dict[num]+1
		if dict[num] > len(numbers)/2:
			return num
	return 0

快排 找中位数 o(nlogn) o(1)

def quick_sort(array,start,end):
    if(start >= end):
        return array
    left = start
    right = end
    mid = array[left]
    while left < right:
        while array[right] >= mid and left < right:
            right -= 1
        array[left] = array[right]
        while array[left] <= mid and left < right:
            left  += 1
        array[right] = array[left]
    array[left] = mid
    quick_sort(array,start,left-1)
    quick_sort(array,left+1,end)

def findnum(numbers):
    quick_sort(numbers,0,len(numbers)-1)
    left =0
    right = len(numbers) -1
    mid = left + (right - left)//2
    possible_ans = numbers[mid]
    times = 0
    for i in numbers:
        if i == possible_ans:
            times += 1
    if times*2 < len(numbers):
        possible_ans = 0
    return possible_ans

判断素数

def isprime(n):
    if n < 2: return False
    for i in range(2,int(math.sqrt(n))+1):
        if n % i == 0:
            return False
    return True

字符串反转

def rev(s):
    return s[::-1]

def rev2(s):
    l = list(s)
    l.reverse()
    result ="".join(l)
    return l

def func(s):     #递归
    if len(s) < 1:
        return s
    return func(s[1:]) +s[0]

def func2(s): #栈
    l = list(s)
    result = ""
    while len(l) >0:
        result += l.pop()
    return result

def fun3(s): #for
    result = ""
    max_index = len(s) -1
    for index,value in enumerate(s):
        result += s[max_index-index]
    return result

判断回文

if (num[::-1] == num[:])

递归与非递归实现 n!

def fact(n):
    if n==1 or n==0:
        return 1
    else:
        return fact(n-1)*n

def fact2(n):
    m =1
    if n==1 or n==0:
        return 1
    else:
        for i in range(1,n+1):
            m = m*i
    return m

二分

def bin_search(alist,num):
    n = len(alist)
    if n >0:
        mid = n//2
        if alist[mid] == num:
            return True
        elif num < alist[mid]:
            return bin_search(alist[:mid],num)
        else:
            return bin_search(alist[mid+1:],num)
    return False

def bin_search2(alist,num):
    n = len(alist)
    left =0
    right = n-1
    while left <= right:
        mid = right +(right - left)//2
        if alist[mid] == num:
            return True
        elif num < alist[mid]:
            right = mid -1
        else:
            left = mid +1
    return False

树的遍历创建和查找

手电筒过河

分析一下:
那么这时将单独过河所需要时间最多的两个旅行者送到对岸去,有两种方式:

最快的(即所用时间t[0])和次快的过河,然后最快的将船划回来,再次慢的和最慢的过河,然后次快的将船划回来
最快的和最慢的过河,然后最快的将船划回来,再最快的和次慢的过河,然后最快的将船划回来。
这样就将过河所需时间最大的两个人送过了河,而对于剩下的人,采用同样的处理方式,接下来做的就是判断怎样用的时间最少

方案1所需时间为:t[0]+2*t[1]+t[i-1]
方案2所需时间为:2*t[0]+t[i-2]+t[i-1]
def time_sesult(n,time): #先排序
    if n<=2 :
        return time[n-1]
    elif n==3 :
        return time[0] + time[1] + time[2]
    else:
        return time_sesult(n-2) + math.min(time[n-1]+2*time[0]+time[n-2],time[0]+2*time[1]+time[n-1])

编辑距离

def edit_distance(word1, word2):
    len1 = len(word1)
    len2 = len(word2)
    dp = np.zeros((len1 + 1,len2 + 1))
    for i in range(len1 + 1):
        dp[i][0] = i    
    for j in range(len2 + 1):
        dp[0][j] = j
     
    for i in range(1, len1 + 1):
        for j in range(1, len2 + 1):
            delta = 0 if word1[i-1] == word2[j-1] else 1
            dp[i][j] = min(dp[i - 1][j - 1] + delta, min(dp[i-1][j] + 1, dp[i][j - 1] + 1))
    return dp[len1][len2]

最大子序列

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bulldozer++

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值