16、加一
给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。
~~题目是真的绕口,就是给定的数组看成整数,然后加一,但是遇到输入是[9,9,9],输出应该是[1,0,0,0],也就是判断数组最后一位是不是9即可。
示例 1:
输入:digits = [1,2,3]
输出:[1,2,4]
解释:输入数组表示数字 123。
示例 2:
输入:digits = [4,3,2,1]
输出:[4,3,2,2]
解释:输入数组表示数字 4321。
示例 3:
输入:digits = [0]
输出:[1]
提示:
1 <= digits.length <= 100
0 <= digits[i] <= 9
class Solution(object):
def plusOne(self, digits):
"""
:type digits: List[int]
:rtype: List[int]
"""
n = len(digits)-1
for i in range(n,-1,-1):
if digits[i] == 9:
digits[i] = 0
else:
digits[i] += 1
return digits
return [1] + digits
17、二进制求和
给你两个二进制字符串,返回它们的和(用二进制表示)。
输入为 非空 字符串且只包含数字 1 和 0。
示例 1:
输入: a = “11”, b = “1”
输出: “100”
示例 2:
输入: a = “1010”, b = “1011”
输出: “10101”
提示:
每个字符串仅由字符 ‘0’ 或 ‘1’ 组成。
1 <= a.length, b.length <= 10^4
字符串如果不是 “0” ,就都不含前导零。
思路:转化成十进制的直接相加,然后再换成二进制即可。
调用python内置函数即可。
class Solution(object):
def addBinary(self, a, b):
"""
:type a: str
:type b: str
:rtype: str
"""
return bin(int(a,2)+int(b,2))[2:]
其中,int(a,2)意思是把二进制的a转化成十进制;
bin(x)是把x变成二进制输出。如
>>>bin(10)
'0b1010'
>>> bin(20)
'0b10100'
因为题目要求,所以调用bin函数时,输出从第三个元素开始,故用了bin()[2:]
18、x的平方根
实现 int sqrt(int x) 函数。
计算并返回 x 的平方根,其中 x 是非负整数。
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
示例 1:
输入: 4
输出: 2
示例 2:
输入: 8
输出: 2
说明: 8 的平方根是 2.82842…,
由于返回类型是整数,小数部分将被舍去。
class Solution(object):
def mySqrt(self, x):
"""
:type x: int
:rtype: int
"""
l,r,ans = 0,x,-1
while l <= r:
mid = (l + r)//2
if mid *mid <= x:
ans = mid
l = mid + 1
else:
r = mid-1
return ans
思路:不要欺骗自己,直接调用函数哪能行???!!!
#可以采用二分法求解,即找0到x之间的数,其平方与x比较。
19、 爬楼梯
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
示例 1:
输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
- 1 阶 + 1 阶
- 2 阶
示例 2:
输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
3. 1 阶 + 1 阶 + 1 阶
4. 1 阶 + 2 阶
5. 2 阶 + 1 阶
思路:又是一道动态规划,反过来想,求n的时候,第n个台阶只能从第n-1或者n-2个上来。到第n-1个台阶的走法 + 第n-2个台阶的走法 = 到第n个台阶的走法,已经知道了第1个和第2个台阶的走法,一路加上去即可!
class Solution(object):
def climbStairs(self, n):
"""
:type n: int
:rtype: int
"""
a = 1
b = 2
if n <= 2:
return n
else:
for i in range(3,n+1):
#temp代表n-2;b代表n-1;
temp = a
a = b
b = temp + b
return b
20、 删除排序链表中的重复元素
给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。
示例 1:
输入: 1->1->2
输出: 1->2
示例 2:
输入: 1->1->2->3->3
输出: 1->2->3
思路:用cur表示当前节点,利用wile循环遍历链表
结束条件为: 遍历完链表,即 cur.next 为空; 头结点 head 可能为空, 则也需要判断 cur 是否为空
遍历过程中:
(1)如果该节点出元素与下一节点元素相同,则删除下一节点: cur.next = cur.next.next;
(2)若不同,则继续遍历
**# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution(object):
def deleteDuplicates(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
cur = head
while cur and cur.next:
if cur.val == cur.next.val:
cur.next = cur.next.next
else:
cur = cur.next
return head
**