【题解】《算法零基础》第21讲:字符串算法(1):字符串遍历

本文介绍了多个关于字符串处理的算法题目,包括判断国际象棋棋盘格子颜色、速算机器人、执行操作后的变量值、查找特定长度子串、检测大写字母、转换为小写字母、判断字符串两半相似性以及替换数字等。每个题目都提供了详细的分析和简洁的代码实现。
摘要由CSDN通过智能技术生成

前言

今天的题相对来说也是比较简单,希望大家都能完美地做出来。

文章参考自:《算法零基础100讲》字符串算法
作者:英雄哪里出来

1812. 判断国际象棋棋盘中一个格子的颜色

原题链接:1812. 判断国际象棋棋盘中一个格子的颜色

在这里插入图片描述

分析

题目要求如果对应的方块位置为白色,返回真,否则为假。
那可以将问题转化为 奇偶性 的问题。

示例:
“a1” a的ASCII码为 097,加1之后为 98 ,对应的方块为黑色。
所以可以得出,相加为偶数的话就是黑色。

代码

bool squareIsWhite(char * coordinates)
{
    //根据题意可推断出,这是一个判断奇偶性的题
    int alpha = coordinates[0];
    int num = coordinates[1];

    //示例:'a'的ASCII值为097, 对应象棋棋盘的 a1的话 , 就是097 + 1 == 98
    // 98 % 2 == 0 是黑色的,所以如果是这种类似情况就返回假
    if ((alpha + num) % 2 == 0)
    {
        return false;
    }

    return true;
}

LCP 17. 速算机器人

原题链接:LCP 17. 速算机器人

在这里插入图片描述

代码

我开头说的保守了,其实今天的是水题。。。

//水题
int calculate(char* s)
{
    if (NULL == s) return 0;

    int x = 1, y = 0;
    for (int i = 0; i < strlen(s); ++i)
    {
        if (s[i] == 'A')
        {
            x = 2 * x + y;
        }
        if (s[i] == 'B')
        {
            y = 2 * y + x;
        }
    }
    return x + y;
}

2011. 执行操作后的变量值

原题链接:2011. 执行操作后的变量值

在这里插入图片描述

代码

int finalValueAfterOperations(char ** operations, int operationsSize)
{
    int x = 0;
    int i = 0;

    while (i < operationsSize)
    {
        if (operations[i][1] == '+')
        {
            x++;
        }
        else
        {
            x--;
        }
        i++;
    }
    
    return x;
}

1876. 长度为三且各字符不同的子字符串

原题链接:1876. 长度为三且各字符不同的子字符串

在这里插入图片描述

分析

遍历,对与 s[i], 如果 s[i + 1]和 s[i + 2]互不相等,结果值加一。

代码

int countGoodSubstrings(char * s)
{
    if (NULL == s) return 0;

    int ans = 0;
    for (int i = 0; i < strlen(s); ++i)
    {
        if (s[i + 1] == '\0' || s[i + 2] == '\0')
            break;
        
        if (s[i] != s[i + 1] && s[i + 1] != s[i + 2] && s[i] != s[i + 2])
        {
            ans++;
        }
    }
    return ans;
}

520. 检测大写字母

原题链接: 520. 检测大写字母

在这里插入图片描述

分析

遍历一遍, 按照题目给出的三条提示来编写。。。

代码

//遍历字符串
//如果大写字母数量为0或者等于字符串长度,或者只有第一个字母为大写,返回真
bool detectCapitalUse(char * word)
{
    if (NULL == word) return false;

    int count = 0;
    int len = strlen(word);
    for (int i = 0; i < len; ++i)
    {
        if (word[i] >= 'A' && word[i] <= 'Z')
            count++;
    }

    if (count == 0 || count == len)
        return true;
    if (count == 1 && word[0] >= 'A' && word[0] <= 'Z')
        return true;
    
    return false;
}

709. 转换成小写字母

原题链接: 709. 转换成小写字母

在这里插入图片描述

分析

根据ASCII码可知,每个大写字母与对应的小写字母之间相差32,且是小写比大写大32.

比如 ‘A’ 的ASCII值为 065, 而 'a’的为 097。

代码

char * toLowerCase(char * s)
{
    for (int i = 0; s[i]; ++i)
    {
        if (s[i] >= 'A' && s[i] <= 'Z')
        {
            s[i] += 32;
        }
    }
    return s;
}

1704. 判断字符串的两半是否相似

原题链接:1704. 判断字符串的两半是否相似

在这里插入图片描述

分析

因为要判断前一半和后一半,所以方法有:

  1. 首尾双指针, 首指针向后走,尾指针向前走,每次判断对应的字母是否为元音。
  2. 遍历两次,第一次遍历前一半,第二次后一半。每次统计元音个数。

代码

这里写的是两次遍历:

//判断元音
bool IsVowel(char c)
{
    return (c == 'A' || c == 'a' || c == 'E' || c == 'e' || c == 'I' || c == 'i' || c == 'O' || c == 'o' || c == 'U' || c == 'u');
}

bool halvesAreAlike(char * s)
{
    if (NULL == s) return false;

    int ans1 = 0, ans2 = 0;
    for (int i = 0; i < strlen(s) / 2; ++i)
    {
        if (IsVowel(s[i]))
            ans1++;
    }
    for (int j = strlen(s) / 2; j < strlen(s); ++j)
    {
        if (IsVowel(s[j]))
            ans2++;
    }

    return ans1 == ans2;
}

1844. 将所有数字用字符替换

原题链接:1844. 将所有数字用字符替换

在这里插入图片描述

代码

没什么说的,水题,混一混

char * replaceDigits(char * s)
{
    if (NULL == s) return NULL;

    for (int i = 1; i < strlen(s); i += 2)
    {
        if (s[i - 1] + s[i] - '0' > 'z')
            return NULL;
        s[i] = s[i - 1] + s[i] - '0';
    }

    return s;
}

练习题

每天留一个最难的,回头做(滑稽)。

原题链接:1805. 字符串中不同整数的数目

在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_索伦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值