周算法总结
- 66:
题目简单明确这里我总结两种方法。
- 代码:
int* plusOne(int* digits, int digitsSize, int* returnSize){
for(int i=digitsSize-1;i>=0;i--)
{
if(digits[i]<9)
{
digits[i]++;
*returnSize=digitsSize;
return digits;
}
digits[i]=0;
}
int* result=(int*)malloc(sizeof(int)*(digitsSize+1));
result[0]=1;
for(int i=1;i<(digitsSize+1);i++)
result[i]=0;
*returnSize=digitsSize+1;
return result;
}
思维方式:首先遍历整个数组,并且包含一个if判断,如果最后一位小于9的话,说明返回的数组只需要最后一位加一即可,所以,我们直接加1并返回,如果不小于9的话,我们将其变为0记为进位的一种方式,若每一次都如此说明数字由n个9组成,那么我们只需要重新申请一个比原先的数组大一个空间的数组,赋值为1~n个0即可。
2. 代码:
int* plusOne(int* digits, int digitsSize, int* returnSize){
int i,n;
int* a=(int*)malloc(sizeof(int)*digitsSize);
for(i=digitsSize-1;i>=0&&digits[i]==9;i--);
if(i>=0)
{
*returnSize=digitsSize;
for(n=digitsSize-1;n>i;n--)
a[n]=0;
digits[i]+=1;
for(n=i;n>=0;n--)
a[n]=digits[n];
}
else
{
*returnSize=digitsSize+1;
a=(int*)realloc(a,sizeof(int)*(digitsSize+1));
for(n=digitsSize;n>0;n--)
a[n]=0;
a[n]=1;
}
return a;
}
第二个思路是分情况考虑,我们知道这里分三种情况要么是n个9,组成,要么是有部分9要么是无9,因此我们设置i将其分为两种大情况,即全为9和不全为9,由i判断,之后分情况走即可。
- 3:
这个题目与之前我写过的链表组件的思想大同小异,但是一旦走入误区就会很复杂。
代码:
int lengthOfLongestSubstring(char * s){
int i=0,max=0,count=0,start=0,flag[128]={0};
while(s[i]!='\0'){
if(flag[s[i]]>start){
count=i-start;
max=count>max?count:max;
start=flag[s[i]];
}
flag[s[i]]=i+1;
i++;
}
count=i-start;
return count>max?count:max;
}
用一个start记录开始的点,用一个128个空间的数组去记录各个字符的位置及变化,同时要用到三目运算符计算最长长度。这里用128是因为,这里的字符包括各种各样的字符,我刚开始写的123报错了😂。这里的asc标准表最终是到127即delete的。这里没啥多说的,多看几遍自然就懂了。