这MD我也不会用啊 先凑合写写吧
我发现APAS就是leetcode的顺序啊 这也太神奇了 哈哈

1.two sum
在一个数组里找俩数,和是target
要我自己做的话肯定是固定左标,然后右标跳,右标跳完左标跳。就是i (0,n),然后j(i,n)。这个复杂度是n方,我还想了一下为啥是n方,想完发现还真是,也不知道算的对不对。然后他给的答案是用map,复杂度是n。为啥一个for里面加一个map.contaisKey是n?难道containsKey是复杂度1吗?查了一下有人讲解containsKey源码,太长懒得看了。还有什么正常复杂度是1最坏复杂度是nlogn,不能用最坏的算。
2.Add Two Sum
两个整数相加求和,要考虑进位啥的。这题练练链表怎么遍历,怎么一个节点一个节点的生成一个链表。我真正写的时候遇到了问题。。。(1)结果链表的头怎么保留,如果一直移动指向,头不就找不到了吗(2)我的结果链表续节点时候,如果两个加数已经遍历完了,那就不应该续新节点了。但是我会多续一个导致结果多一个0。问题1我看标准答案也没解决,直接把头和参与移动的指针分开了,到时候直接返回头.next。问题二就是先续节点,加数还有才续,不要加完了才续。

1
2
3
ListNode nextNode=new ListNode();
currentNode.next=nextNode;
currentNode=currentNode.next;

这个currentNode,只有.next时候他才能代表一个节点,不然只能看作一个指针。还挺巧妙。
这题我想了很久很久啊,其实挺多细节的。比如

1
2
3
4
5
6
7
<!-- 保证有值才读 -->
int l1val=0;
int l2val=0;
if(l1!=null)
l1val=l1.val;
if(l2!=null)
l2val=l2.val;
1
2
3
4
5
6
 while(l1!=null||l2!=null){
//把两个加数都走完了
}
if(carry>0)
currentNode.next=new ListNode(carry);
//但是结果比长的加数还多一位
1
2
3
4
5
<!-- while里面,每次都是给next节点赋值,也就是说第一次进来的currentNode根本没被用到,直接就是0了。 所以最后要return 头.next-->
ListNode nextNode=new ListNode();
currentNode.next=nextNode;
currentNode=currentNode.next;
currentNode.val=(l1val+l2val+carry)%10;

3.Longest Substring Without Repeating Characters
最长不重复子串,就是左标右标,右标遇到重复的了,就把左标挪到上一次遇到右标字母的位置的下一个。

1
2
for(int i=leftIndex;i<leftIndexNew;i++)
map.remove(s.charAt(i));

我是上面这么写的。比如abcdcb当左=2右=4时,左会被更新为3。可是3以前的字母为什么不应该从map中删除呢,比如右接着滑到5发现map里面有(b,1)了,可是此时当前子串是dc里明明没有b啊。

1
2
if (map.containsKey(s.charAt(j))) {
i = Math.max(map.get(s.charAt(j)), i);

答案Sliding Window Optimized是这么写的,max()里比较的两个数,有下面两种情况,都可以用这一句话,挺神奇。

4.Median of Two Sorted Arrays
我就把两个数组合成一个数组了。 两个有序数组的合并也是归并排序中的一部分 顺便奇偶个数数组求中值的问题我每次遇到都要想好久。。。我还写得什么长度-1后除以2再-0.2和+0.2之后四舍五入。。。
下次我要按照下面这么写

1
2
3
4
5
if (count % 2 == 0) {
return (nums[count / 2 - 1] + nums[count / 2]) / 2.0;
} else {
return nums[count / 2];
}

改一下,其实是照着答案改的,好看了不少。

1
2
3
4
5
if(i2==nums2.length){
for(int j=0;j<total-i-1;j++)
numsAdded[i+1+j]=nums1[i1+j];
break;
}

改成

1
2
3
4
while(i1!=nums1.length)
{
numsAdded[(i++)+1]=nums1[i1++];
}

答案给的是二分。。。懒得看了。。。

5.Longest Palindromic Substring
这个没啥说的,写一个函数传入(string,左,右)判断是不是对称的。如果传入(string,i,i)就是围绕一个字母对称,传入(string,i,i+1)就是围绕两个字母对称。先判断当前对不对称,对称了再移动,所以围绕两个的字母会先验证。
6.ZigZag Conversion
我没有写,就大概想了一下。。。
7.Reverse Integer
要点就是怎么用while取反,真挺巧妙,让我不看答案我肯定写不出来。

1
2
3
4
5
while(left!=0){
unit=left%10;//个位
left=left/10;//剩下的
result=result*10+unit;
}

其实也不一定,我5号看的,今天8号。居然能写出来,哈哈。然后记得为了防止越界result要声明为long。

8.String to Integer (atoi)
没写感觉没什么意思。

9.Palindrome Number
也没写,我感觉这题和第七题一样。

10.Regular Expression Matching
一道hard题,没什么思路。这个得以后认真做一下。


后记
第六题和第十题都没写,第一次写日志有点虎肉蛇尾啊,哈哈。完成时间是上午2:25
2021年1月8日(星期五)