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;
}
注:这里采用这种顺序就通过不了
改成这样,因为只判断一个符号,判断两个都是错的