前言
今天的题相对来说也是比较简单,希望大家都能完美地做出来。
文章参考自:《算法零基础100讲》字符串算法
作者:英雄哪里出来
目录
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. 长度为三且各字符不同的子字符串
分析
遍历,对与 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. 判断字符串的两半是否相似
分析
因为要判断前一半和后一半,所以方法有:
- 首尾双指针, 首指针向后走,尾指针向前走,每次判断对应的字母是否为元音。
- 遍历两次,第一次遍历前一半,第二次后一半。每次统计元音个数。
代码
这里写的是两次遍历:
//判断元音
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. 字符串中不同整数的数目