【每日刷题Day85】

【每日刷题Day85】

个人主页:开敲

所属专栏:每日刷题

文章目录

1. 125. 验证回文串 - 力扣(LeetCode)

2. 43. 字符串相乘 - 力扣(LeetCode)

3. 557. 反转字符串中的单词 III - 力扣(LeetCode)

1. 125. 验证回文串 - 力扣(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;

}

2. 43. 字符串相乘 - 力扣(LeetCode)

//思路:竖式乘法计算,使用数组累加每一位上的和,这么说可能听不懂,我们来看图理解

【每日刷题Day85】_第1张图片

//注:两个数相乘后,其长度最大为两数的长度和,因为在使用数组存储时我们可以直接开两数长度之和的空间,从数组最后向前存储,这样可以省去翻转。

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;

}

3. 557. 反转字符串中的单词 III - 力扣(LeetCode)

//思路:双指针遍历。初始两个指针都指向开头,让第一个指针先走,遇到' '时将两指针间的字符翻转,随后第二个指针指向第一个指针的下一个位置,继续让第一个指针走,重复上述过程直到遇到'\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;

}

你可能感兴趣的:(每日刷题,算法,数据结构,leetcode)