打卡leetcode第7天

1.最长回文子串

【题目】

 【法1 中心扩展法】

以某个元素为中心,分别计算偶数长度的回文最大长度和奇数长度的回文最大长度。

  • 时间复杂度:O(n²),n为字符串长度。
  • 空间复杂度:O(1)。
	char* longestPalindrome(char* s)
	{
		int len = strlen(s);
		if (len <= 1) { return s; }
		int start = 0;
		int maxlen = 0;
		//i表示中间元素下标
		for (int i = 1; i < len; i++)
		{
			//偶数长度
			int low = i - 1;
			int high = i;
			while (low >= 0 && high < len && s[low] == s[high])
			{
				low--;
				high++;
			}
			if (high - low - 1 > maxlen)//这里因为前边退出循环,low和high各减去了1,相当于减2,所以+1-2=-1
			{
				maxlen = high - low - 1;
				start = low + 1;
			}
			//奇数长度
			low = i - 1; high = i + 1;
			while (low >= 0 && high < len && s[low] == s[high])
			{
				low--;
				high++;
			}
			if (high - low - 1 > maxlen)
			{
				maxlen = high - low - 1;
				start = low + 1;
			}
		}
		char *arr = (char *)malloc(sizeof(int) * (maxlen * 2));
		int i = 0;
		for (; i < maxlen; i++)
		{
			arr[i] = s[start++];
		}
		arr[i] = '\0';
		return arr;
	}

【参考】:LeetCode第五题:最长回文子串(C语言)_The Laughing Uncle的博客-CSDN博客_最长回文子串c语言

2.Z字形变换

【题目】

 

【分析】

 【代码】C

char * convert(char * s, int numRows){
    if(numRows == 1)
        return s;
    int length = strlen(s);
    char *result = (char*)malloc(sizeof(char)*(length + 1));
    int number = 0;
    int n = 2 * numRows - 2;
    for(int i = 0;i < numRows;i++){     //分配每一行
        for(int j = 0;j < length;j++){  //遍历整个数组
            int k = j % n;
            if(k == i || k == n - i){
                result[number] = s[j];
                number++;
            }
        }
    }
    result[number] = '\0';
    return result;
}



3.整数反转

【题目】

【分析】

 

【代码】C

int reverse(int x){
    int ans=0;
    while(x){
       if(ans<INT_MIN/10||ans>INT_MAX/10){
           return 0;
       }
       int digit=x%10;
       ans=ans*10+digit;
       x/=10;
    }
    return ans;
}

4.字符串转整数

【题目】

 

【分析】

【代码】C

int myAtoi(char * s){
    int len=strlen(s);
    int flag=1;
    int *arr=(int*)malloc(sizeof(int)*len);
    long double num=0;
    while(*s==' '){
        s++;
        len--;
    }
    
    if(*s=='+'){
        s++;
        len--;
    }
    else if(*s=='-'){
        flag=-1;
        s++;
        len--;
    }
    int i=0;
    while(*s!='\0'){
            arr[i]=(int)*s-48;
            if(arr[i]>9||arr[i]<0){
                break;
            }
            num=num*10+arr[i];
            s++;
            i++;
        }
        
    if(num*flag>=INT_MAX){
                return INT_MAX;
            }
    if(num*flag<=INT_MIN){
                return INT_MIN;
            }
     return flag*num;   

}

注:这里采用这种顺序就通过不了

改成这样,因为只判断一个符号,判断两个都是错的

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值