终于到刷题的最后一周了,这周每天2-3题
目前进度:
89/100
1.2020/04/20
a).题目:
遍历数组,得到数组的最大字符串长度。
如果字符串的长度小于最大长度,则直接加入有效字母。
若大于长度,则在最后添加空格。
最后使用rstrip()函数去掉右边的空格,并返回result。
答案:
b).题目:
每次循环只观察list中首尾两个元素,如果首尾相等,则删除一个元素。
没有新建元素,空间为O(1)
答案:
c).题目:
新建headList存储链表里所有元素。
存储0-m之间的所有元素
存储m-n之间的所有元素,并翻转m-n元素
存储n-len(headList)的所有元素
新建一个链表,将result reverse后(头插法)加入新链表并返回。
答案:
目前进度:
92/100
2.2020/04/21
a).题目:
将链表里所有元素存入headList中。
使用collections.Counter()函数将出现次数为1的元素存入tempList,并反转tempList(头插法)
新建一个链表,将tempList元素加入新建链表并返回
答案:
b).题目:
将l1和l2的所有值存入num1和num2两个list里,并反转list(个位数和最高位位置相反)
翻转后变为10进制数后,对两数进行相加,并将相加后的结果存入list。
新建一个链表,将list中所有元素加入新建链表(头插法,不需要再次翻转list,因为各位和最高为位置相反),并返回新链表。
答案:
c).题目:
解法1:将所有1-n的数存入list。
遍历list,遇到1数count+1。
遍历完成后返回count。
(需要hard code长度大的数)
解法2:当最高位为1时,计算[0,999]中1的个数。
计算234中1的个数
最后加上最高位的情况
当最高位为2时,计算[1000,1999]中1的个数
计算234中1的个数
加上高位为1时的情况
解法1答案:
解法二解析:
解法二答案:
目前进度:
95/100
3.2020/04/22
a)题目:
新建数组left和right,并使left[0]=A[0],right[len(A-1)]=A[len(A)-1]。
left为从左向右数的某个点的最大值,right为从右向左数某个点的最小值。
当左边的值全部小于或等于右边时,返回索引值。
答案:
b).题目:
使用collections.Counter()函数,当counter[i]>len(nums)/3时,将num加入result,返回result。
答案:
c)题目:
使用双指针,设定返回值为最大。
当a[i]>b[j]时,i+1
当A[i]<=[b[j]时,j+1
答案:
目前进度:
98/100
明天过生日,可能鸽一天。 不鸽了,起来干💪。
4.2020/04/23
a).题目:
将链表所有元素放入list后,删除list里倒数第n个元素。
注意,这里删除不能使用remove,remove删除是list中第一个该元素
应使用del删除倒数第n个元素。
例:list=[4,5,4], n=1
使用remove后,第一个4被删除,list变为[5,4],而不是[4,5]。
翻转headList(头插法)后,新建链表并将headList加入新建链表并返回。
答案:
b)题目:
二分法。
新建left,right,使left=0,right=len(arr)-1
当arr中不存在target时,返回-1。
当left不等于right时,分三种情况进入循环。
情况1:当arr[left]<arr[mid],则左边区间为升序
此时判断如果target在左边升序区间,则更新right=mid
如果target在右半边区间,则更新left=mid+1
情况2:当arr[left]>arr[mid],则右边区间为升序
此时判断如果target在左边升序区间,则更新right=mid
如果target在右半边区间,则更新left=mid+1
情况3:如果arr[left]==arr[mid],则可能时找到了target,或者遇到了重复的target。
如果arr[left]!=target,说明还没有找到,需要排除重复值。
如果arr[left]=target,说明已经找到target,使right=left,并退出循环。
网友评论