【每日刷题Day85】
个人主页:开敲
所属专栏:每日刷题
文章目录
1. 125. 验证回文串 - 力扣(LeetCode)
2. 43. 字符串相乘 - 力扣(LeetCode)
3. 557. 反转字符串中的单词 III - 力扣(LeetCode)
//思路:双指针遍历。两头向中间遍历,判断是否有不同字母。
bool isPalindrome(char* s)
{
char* arr = (char*)malloc(sizeof(char)*strlen(s)+1);
int count = 0;
while(*s!='\0')
{
if(*s>='A'&&*s<='Z')
{
arr[count++] = *s+32;
}
if((*s>='a'&&*s<='z')||(*s>='0'&&*s<='9'))
{
arr[count++] = *s;
}
s++;
}
arr[count] = '\0';
int left = 0;
int right = count-1;
while(left<=right)
{
if(arr[left]!=arr[right])
{
return false;
}
left++;
right--;
}
return true;
}
//思路:竖式乘法计算,使用数组累加每一位上的和,这么说可能听不懂,我们来看图理解
//注:两个数相乘后,其长度最大为两数的长度和,因为在使用数组存储时我们可以直接开两数长度之和的空间,从数组最后向前存储,这样可以省去翻转。
char* multiply(char* num1, char* num2)
{
int len1 = strlen(num1);
int len2 = strlen(num2);
char* ans = (char*)malloc(sizeof(char)*(len1+len2+1));
int count = 0;
if(num1[0]=='0'||num2[0]=='0')
{
ans[0] = '0';
ans[1] = '\0';
return ans;
}
int* arr = (int*)calloc(len1+len2,sizeof(int));
int flag1 = len1+len2-1;
for(int i = len1-1;i>=0;i--)
{
int flag2 = flag1;
for(int j = len2-1;j>=0;j--)
{
arr[flag2--]+=((num1[i]-'0')*(num2[j]-'0'));
}
flag1--;
}
int flag = 0;
for(int i = len1+len2-1;i>=0;i--)
{
arr[i]+=flag;
flag = 0;
while(arr[i]>=10)
{
flag++;
arr[i]-=10;
}
}
int i = 0;
if(!arr[0])
i = 1;
while(i<=len1+len2-1)
{
ans[count++] = arr[i++]+'0';
}
ans[count] = '\0';
return ans;
}
//思路:双指针遍历。初始两个指针都指向开头,让第一个指针先走,遇到' '时将两指针间的字符翻转,随后第二个指针指向第一个指针的下一个位置,继续让第一个指针走,重复上述过程直到遇到'\0'
//遇到'\0'后将最后一个单词翻转
void Reverse(char* s,int left,int right)
{
while(left
{
char tmp = s[left];
s[left] = s[right];
s[right] = tmp;
left++;
right--;
}
}
char* reverseWords(char* s)
{
int prev = 0;
int pcur = 0;
while(s[pcur]!='\0')
{
if(s[pcur]==' ')
{
Reverse(s,prev,pcur-1);
prev = pcur+1;
}
pcur++;
}
Reverse(s,prev,pcur-1);
return s;
}