LeetCode刷题笔记详细记录 题目3-10

版权声明:随意转载,注明链接地址即可 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;
    }
        
}

猜你喜欢

转载自blog.csdn.net/weixin_38812277/article/details/84282598
今日推荐