2 Add Two Numbers
Solution:
- 指针的简单操作
3 Longest Substring Without Repeating Characters
Solution:
- 开个bool数组记录下每个字符最晚出现的时间点a[s[i]],开个变量作为前一次冲突出现的时间戳k,扫一遍整个串边维护边更新最优值就好了ans=max(ans,i-max(a[s[i]],k-1)。O(n)
5 Longest Palindromic Substring
Solution:
- 枚举每一位为中间点分奇偶向两边扩散,O(n^2)。
- 有一种叫做manacher算法的东西,稍微利用对称性就可以O(n)求回文串了,很简单,具体做法可以百度一下,很多详解。
- //写完回来发现这篇的水题包可讲解的东西太少,所以稍微说下manacher吧。
- 首先在串的每个字符间增加一个无意义字符如’#’,这样不需要考虑原串长度为偶数的回文串了。
- 那么取f[i]表示以i为中心的最长回文子串长度(长度是串长一半,即该串为i-f[i]~i+f[i])
- 当前要求f[j]了,假设i点为形如i+f[i]式子值中的最大值(i为1~j-1范围),则f[j]一定程度上依赖i+f[i]。
- 若i+f[i]>j,由对称性可得f[j]至少为min(f[2*i-j],f[i]+i-j)
- 否则,f[j]至少为1。
- 而后,扩一扩试试看f[j]还能不能更大。
- 这种做法可以保证O(n)是显然的,向右扩展最多只会到n,保证了不会有重复的扩展发生。
- 至于对称性那一步的具体过程,纸上稍微画画就明白了,提示:f[2*i-j]—>f[i-(i-j)] f[i]+i-j—> (f[i]+i)-j
6 ZigZag Conversion
Solution:
for (int i=1;i<=numRows;i++)
{
int j;
if (i==1||i==numRows)
{
j=i-1;
while (j<len)
{
ans+=s[j]; j=j+n-1+n-2+1;
}
} else
{
bool p=true;
j=i-1;
while (j<len)
{
ans+=s[j];
if (p) {j=j+n-i+n-i-1+1; p=false;} else
{j=j+i-1+i-1; p=true;}
}
}
}
- 奇怪的映射题目。不要忘记如果n=1输出原串- -
7 Reverse Integer
Solution:
- 坑点在于,如果翻过来不在int范围要输出0哟。
- 保持只使用int的话,不是特别好写。