这里写目录标题
- 一、现场写一个代码,有两个字符串类型的数字,实现一个方法将它们进行相加,并返回相加后的数值。(要考虑数据的长度问题)
- 一、287. 寻找重复数
- 三、617. 合并二叉树
一、现场写一个代码,有两个字符串类型的数字,实现一个方法将它们进行相加,并返回相加后的数值。(要考虑数据的长度问题)
class S:def func(self,a,b):carry=0res=''i=len(a)-1j=len(b)-1while i>=0 or j>=0 or carry!=0:A=int(a[i]) if i>=0 else 0B=int(b(j)) if j>=0 else 0sumAB=A+B+carryif sumAB>10:carry=1sumAB=sumAB%10else:carry=0i-=1j-=1res+=str(sumAB)r = S()
num1 = "99"
num2 = "999"
print(r.func(num1, num2))
一、287. 寻找重复数
中等
给定一个包含 n + 1 个整数的数组 nums ,其数字都在 [1, n] 范围内(包括 1 和 n),可知至少存在一个重复的整数。
假设 nums 只有 一个重复的整数 ,返回 这个重复的数 。
你设计的解决方案必须 不修改 数组 nums 且只用常量级 O(1) 的额外空间。
示例 1:
输入:nums = [1,3,4,2,2]
输出:2
示例 2:
输入:nums = [3,1,3,4,2]
输出:3
示例 3 :
输入:nums = [3,3,3,3,3]
输出:3
解题思路
首先明确前提,整数的数组nums中的数字范围是 [1,n]。考虑一下两种情况:
一、如果数组中没有重复的数,以数组 [1,3,4,2]为例,我们将数组下标 n 和数 nums[n] 建立一个映射关
其映射关系 n->f(n)为:
0->1
1->3
2->4
3->2
我们从下标为 0 出发,根据 f(n)计算出一个值,以这个值为新的下标,再用这个函数计算,以此类推,直到下标超界。这样可以产生一个类似链表一样的序列。
0->1->3->2->4->null
如果数组中有重复的数,以数组 [1,3,4,2,2] 为例,我们将数组下标 n 和数 nums[n] 建立一个映射关系 f(n),
其映射关系 n->f(n) 为:
0->1
1->3
2->4
3->2
4->2
同样的,我们从下标为 0 出发,根据 f(n)计算出一个值,以这个值为新的下标,再用这个函数计算,以此类推产生一个类似链表一样的序列。
0->1->3->2->4->2->4->2->……
这里 2->4 是一个循环,那么这个链表可以抽象为下图:
从理论上讲,数组中如果有重复的数,那么就会产生多对一的映射,这样,形成的链表就一定会有环路了,
综上
1.数组中有一个重复的整数——》链表中存在环
2.找到数组中的重复整数 ——> 找到链表的环入口
class S287:def func(self,nums):slow=0fast=0while True:slow=nums[slow] #slow=slow.nextfast=nums[nums[fast]] #fast=fast.next.nextif fast==slow: #首次相遇点breakfast=0 #fast回到起点while slow!=fast: #再次相遇即为重复数字slow=nums[slow]fast=nums[fast]
三、617. 合并二叉树
简单
给你两棵二叉树: root1 和 root2 。
想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为 null 的节点将直接作为新二叉树的节点。
返回合并后的二叉树。
注意: 合并过程必须从两个树的根节点开始
class S:def func(self, root1, root2):if not root1:return root2if not root2:return root1root = TreeNode(root1.val + root2.val)root.left = self.func(root1.left, root2.left)root.right = self.func(root1.right, root2.right)return root