版权声明:随意转载,注明链接地址即可 https://blog.csdn.net/weixin_38812277/article/details/84282598
3、查找无重复字符串的最大子串
错误类型:变量初始值需要讨论,多个if else 需要注意对应关系
int lengthOfLongestSubstring(char* s) {
int i,j,k;
int s_len=1;//【此处错误,存在考虑不周全】
//int temp_len=1;
for(i=0;s[i] != '\0';i++)
{
for(j=i+1;s[j] != '\0';j++)
{
for(k=i;k != j;k++)//从i到k的对比字符
if(s[k] == s[j])
break;
if(k == j) //新加入的第j个字符没有重复
if(j-i+1 > s_len) //【注意此处的if和上面if的关系】
s_len = j-i+1;
else //新加入的第j个字符有重复 【此处else对应的if有误,应注意】
break;
}
}
return s_len;
}
调试正确
int lengthOfLongestSubstring(char* s) {
int i,j,k;
int len = strlen(s);
int s_len=len ? 1 : 0;
//原版:for(i=0;s[i] != '\0';i++)
for(i=0;i < len - s_len;i=k+1)
{
for(j=i+1;s[j] != '\0';j++)
{
for(k=i;k != j;k++)//从i到k的对比字符
if(s[k] == s[j]) break;
if(k == j) //新加入的第j个字符没有重复
{
if(j-i+1 > s_len)
s_len = j-i+1;
}
else //新加入的第j个字符有重复
break;
}
}
return s_len;
}
4、暂时跳过
5、寻找字符串中最长的回文字符串
错误类型:自动变量初始化,数组大小初始化使用的常量,数组越界访问,循环临界条件
char* longestPalindrome(char* s) {
int i, j;
int start,end;//自动变量没有初始化,后期没有赋值,直接使用,会出现随机数字
const int len = strlen(s);
static char sub_str[len];
//自动存储类的数组可以用变量初始化长度,变长数组,非自动存储类不能;编译器不会检查数组越界访问,需要自己要求
int sub_len = len ? 1:0;
for(i=0;i<len;i++)//循环次数错误
{
if(s[i]==s[i+1])
{
for(j=0;i-j>=0 && i+j+1<len;j++)
{
if(s[i-j] == s[i+j+1])
{
if(2*j+2 > sub_len)
{
sub_len = 2*j+2;
start = i-j;
end = i+j+1;
}
}
else
break;
}
}
if(s[i] == s[i+2])
{
for(j=0;i-j>=0 && i+j<len;j++)
{
if(s[i-j] == s[i+j+2])
{
if((2*(j+1)+1) > sub_len)
{
sub_len = 2*(j+1)+1;
start = i-j;
end = i+j+2;
}
}
else
break;
}
}
}
for(j=0;start<=end;start++,j++)
{
sub_str[j] = s[start];
}
if(j <= len)
sub_str[j]='\0';//字符串结束标志,需要手动添加
return sub_str;
}
char* longestPalindrome(char* s) {
int i, j;
int start=0,end=0;//自动变量需要初始化0,不会自动初始化
const int len = strlen(s);
static char sub_str[1001];//静态变量数组的大小不能使用const变量,非静态数组可以使用
int sub_len = len ? 1:0;
for(i=0;i<len-1;i++)
{
if(s[i]==s[i+1])
{
for(j=0;i-j>=0 && i+j+1<len;j++)
{
if(s[i-j] == s[i+j+1])
{
if(2*j+2 > sub_len)
{
sub_len = 2*j+2;
start = i-j;
end = i+j+1;
}
}
else
break;
}
}
if(s[i] == s[i+2])
{
for(j=0;i-j>=0 && i+j<len;j++)
{
if(s[i-j] == s[i+j+2])
{
if((2*(j+1)+1) > sub_len)
{
sub_len = 2*(j+1)+1;
start = i-j;
end = i+j+2;
}
}
else
break;
}
}
}
for(j=0;start<=end;start++,j++)
{
sub_str[j] = s[start];
}
if(j <= len)
sub_str[j]='\0';
return sub_str;
}
6、将字符串Z字形排列后按行输出
错误类型:除数为0的情况忽略;表达式中都是整数计算结果也是整数,不是赋值的时候强制转换的。
char* convert(char* s, int numRows) {
int down=1,si=0,i,j;
int len = strlen(s);
char* p = malloc(len);
printf("len = %d\n",len);
if(0 == len || numRows == 1 || numRows >= len)//特殊情况归纳
return s;
int columns = len / (2*numRows-2);//这里的除数可能等于0
if(columns != len/(2.0*numRows-2))//此处注意,表达式中都是整数,计算结果也是整数
columns = columns+1;
columns = (numRows-1)*columns;//求出二维矩阵的列数 最大值
char Z_array[numRows][columns];//存放Z字形字符串的二维数组
for(i=0;i<numRows;i++)
for(j=0;j<columns;j++)
Z_array[i][j] = '\0';
i=0;
j=0;
while(si < len)
{
if(1 == down)
{
for(;i<numRows && si<len;i++)//局部变量代码块内是否初始化赋值
{
Z_array[i][j] = s[si];
si++;
}
down = 0;
}
else
{
for(i=i-2,++j;i>0 && si<len;i--,j++)//此处逻辑理顺
{
Z_array[i][j] = s[si];
si++;
}
down = 1;
}
}
si = 0;
for(i=0;i<numRows && si <len;i++)
{
for(j=0;j<columns && si < len;j++)
{
if(Z_array[i][j] != '\0')
{
p[si] = Z_array[i][j];
si++;
}
}
}
p[si]='\0';//字符串结束
return p;
}
7、反转一个整数
错误类型:整数的表示范围不清楚,int long longlong 的区别,负数的余数还是负数
int reverse(int x) {
long long temp = 0;//此处不能用int
while(x)
{
temp = temp*10 + x%10;//负数的余数任然是负数,不必要区分正数和负数
x = x/10;
}
if(temp < pow(2,31)-1 && temp >= -1*pow(2,31))//注意int和long long 的表示范围
return temp;
else
return 0;
}
8、字符串转整数
错误类型:基本数据类型的表示范围,补码,指针运算符的优先级
例如: int r= -2147483648 和long long r= -2147483648的区别
int myAtoi(char* str) {
int i=0;
long long r=0;//这里的long long不能换成 int
int flags = 1;
while(*(str+i) == ' ')
i++;//跳过所有的空格
if(*(str+i) == '-')//第一个非空字符是负号
{
flags = -1;
i++;
}
else if(*(str+i) == '+')//第一个非空字符是正号
{
flags = 1;
i++;
}
if(*(str+i) >= '0' && *(str+i) <='9')//第一个非空字符是数字
{
while(*(str+i) >= '0' && *(str+i) <= '9')
{
r = r*10 +flags * (*(str+i) - 48 );
if(r>2147483647) return 2147483647;
else if(r < -2147483648) return -2147483648;
i++;
}
return r;
}
else
return 0;
}
9、判断一个整数是否是回文数
完美,一次提交通过。。回顾一下:数组缺省初始化:自动变量不会自动初始化,里面存储随机值;部分项初始化后其他项初始化为0.
bool isPalindrome(int x) {
int temp[10]={0};//数组的初始化
int i=0,j=0;
if(x < 0)
return false;
else
{
while(x)
{
temp[i] = x%10;
x = x/10;
i++;
}
for(--i;j<i;i--,j++)
{
if(temp[i] == temp[j]);
else return false;
}
return true;
}
}