【剑指offer】Python面试算法刷题汇总

仅有代码和题目,题干及要求见《剑指offer》原题~~
以下仅包含解题思路和原代码

1、把字符串转换成整数:

# -*- coding:utf-8 -*-
'''
    	函数功能:输入字符串转整数,不能使用str()和int()函数
    			'saaf12425'	返回0
    			''			返回0
    			'124'		返回124
    			'+123'		返回123
    			'-321'		返回-321
    	'''
class Solution:
    def StrToInt(self, s):
        # write code here
        if s == '':
        	return 0

        elif s[0] == '+':
        	s = s[1:]
        	s = s[::-1]
        	num = 0
        	for i,v in enumerate(s):
        		temp = (ord(v)-ord('0'))*(10**i)
        		num += temp

        elif s[0] == '-':
        	s = s[1:]
        	s = s[::-1]
        	num = 0
        	for i,v in enumerate(s):
        		temp = (ord(v)-ord('0'))*(10**i)
        		num += temp
        	num = -num

        elif s.isdigit():
        	s = s[::-1]
        	num = 0
        	for i,v in enumerate(s):
        		temp = (ord(v)-ord('0'))*(10**i)
        		num += temp
        	
        else:
        	return 0
        return num

if __name__ == '__main__':
	s = Solution()
	st1 = '21546'
	st2 = 'selsf21435'
	st3 = '+124356'
	st4 = '-123'
	st5 = ''
	print(s.StrToInt(st1))
	print(s.StrToInt(st2))
	print(s.StrToInt(st3))
	print(s.StrToInt(st4))
	print(s.StrToInt(st5))

2、变态跳台阶:

# -*- coding:utf-8 -*-
class Solution:
    def jumpFloorII(self, number):
        # write code here
        if number <= 0:
        	return 0
        elif number == 1:
        	return 1
        first = 1
        for i in range(1,number):
        	result = first * 2
        	first = result
        return result

if __name__ == '__main__':
	s = Solution()
	print(s.jumpFloorII(5))

3、不用加减乘除实现加法:

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

if __name__ == '__main__':
	s = Solution()
	print(s.Add(2,3))

4、丑数:

# -*- coding:utf-8 -*-
'''
使用遍历法求第k个丑数,从1开始遍历,如果是丑数则count+,直到count=k为止

Step1.如果一个数能够被2整除,那么让他继续除以2;

Step2.如果一个数能够被3整除,那么让他继续除以3;

Step3.如果一个数能够被5整除,那么让他继续除以5;

Step4.如果最后这个数变为1,那么这个数就是丑数,否则不是。
'''
class Solution:
    def GetUglyNumber_Solution(self, index):
        # write code here
        count = 1
        while count < index:
        	if count % 2 == 0:
        		count = count // 2
        		i = count % 2
        		if i == 1:
        			count += 1
        	if count % 3 == 0:
        		count = count // 3
        		i = count % 3
        		if i == 1:
        			count += 1
        	if count % 5 == 0:
        		count += 1
        	if count % 5 == 1:
        		count += 1

        	return count
if __name__ == '__main__':
	s = Solution()
	print(s.GetUglyNumber_Solution(11))

5、从上往下打印二叉树:

# -*- coding:utf-8 -*-
# 二叉树的层序遍历
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    # 返回从上到下每个节点值列表,例:[1,2,3]
    def PrintFromTopToBottom(self, root):
        # write code here
        list1 = []
        if not root:
        	return []
        queue = [root]
        while len(queue):
        	node = queue.pop(0)
        	list1.append(node.val)
        	if node.left:
        		queue.append(node.left)
        	if node.right:
        		queue.append(node.right)

        return list1

6、从尾到头打印链表元素:


# 无敌高深递归的使用
class Node:
	def __init__(self,x):

		self.val = x
		self.next = None

class Solution:

	def printListFromTailToHead(self,Node):
		if Node is None:
			return []

		return self.printListFromTailToHead(Node.next)+[Node.val]

if __name__ == '__main__':
	s = Solution()
	node1 = Node(1)
	node2 = Node(2)
	node3 = Node(3)
	node1.next = node2
	node2.next = node3
	node3.next = None
	print(s.printListFromTailToHead(node1))
#	print(s.printListFromTailToHead(node2))
#	print(s.printListFromTailToHead(node3))


# 使用while判断结点数据,利用insert插入list的0位置达到逆序的效果
class Node:
	def __init__(self,x):

		self.val = x
		self.next = None

class Solution:

	def printListFromTailToHead(self,Node):
		list1 = []
		while Node:
			lis
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值