前言
原文章可参考:《算法零基础100讲》第23讲
目录
58. 最后一个单词的长度
原题链接:58. 最后一个单词的长度
代码
因为要求最后一个单词长度,所以从后往前遍历字符串,遇到不是空格的就计数;如果遇到了空格,就退出。
int lengthOfLastWord(char * s)
{
int len_word = 0;
for (int i = strlen(s) - 1; i >= 0; --i)
{
if (s[i] != ' ')
len_word++;
if (s[i] == ' ' && len_word != 0)
{
break;
}
}
return len_word;
}
434. 字符串中的单词数
原题链接:434. 字符串中的单词数
代码
int countSegments(char * s)
{
if (NULL == s || s[0] == '\0')
return 0;
int count = 0;
for (int i = 0; i < strlen(s); ++i)
{
if ((i == 0 || s[i - 1] == ' ') && s[i] != ' ')
{
count++;
}
}
return count;
}
2042. 检查句子中的数字是否递增
原题链接:2042. 检查句子中的数字是否递增
代码
先将字符串中的数字都提取出来,再遍历比较。
bool areNumbersAscending(char * s)
{
int ans[200];
int ansSize = 0;
for (int i = 0; i < strlen(s); ++i)
{
if (isdigit(s[i]))
{
int num = 0;
while (i < strlen(s) && isdigit(s[i]))
{
num = num * 10 + (s[i] - '0');
++i;
}
ans[ansSize++] = num;
}
}
for (int i = 0; i < ansSize - 1; ++i)
{
//printf("%4d", ans[i]);
if (ans[i] >= ans[i + 1])
return false;
}
return true;
}
2047. 句子中的有效单词数
原题链接:2047. 句子中的有效单词数
代码
//判断符号
bool Is_symbol(char c)
{
return (c == '!' || c == '.' || c == ',');
}
//判断数字
bool Is_digit(char c)
{
return (c >= '0' && c <= '9');
}
//判断小写字母
bool Is_alpha(char c)
{
return (c >= 'a' && c <= 'z');
}
//判断单词
bool Is_word(char* s)
{
int hyphen = 0, symbol = 0;
for (int i = 0; i < strlen(s); ++i)
{
if (Is_digit(s[i]))
return false;
if (s[i] == '-')
{
if (i - 1 >= 0 && Is_alpha(s[i - 1]) && i + 1 < strlen(s) && Is_alpha(s[i + 1]))
hyphen++;
else
{
return false;
}
}
if (Is_symbol(s[i]))
{
symbol++;
if (i != strlen(s) - 1)
return false;
}
if (hyphen > 1 || symbol > 1)
return false;
}
return true;
}
int countValidWords(char * sentence)
{
if (NULL == sentence) return 0;
int count = 0;
char* token = NULL;
token = strtok(sentence, " ");
while (token != NULL)
{
if (Is_word(token))
{
count++;
}
token = strtok(NULL, " ");
}
return count;
}
1816. 截断句子
原题链接:1816. 截断句子
代码
从后往前搞,很妙。
//很妙的方法
char * truncateSentence(char * s, int k)
{
if (NULL == s) return NULL;
char* p = s;
while (*p++)
{
if (*p == ' ' && --k == 0)
{
*p = '\0';
return s;
}
}
return s;
}
1784. 检查二进制字符串字段
原题链接:1784. 检查二进制字符串字段
代码
这个题刚开始没看懂题意,导致提交了好多次才通过。。
其实题意就是不能有 “01” 这种组合。。
bool checkOnesSegment(char * s)
{
if (NULL == s) return false;
if (strlen(s) == 1 && s[0] == '1')
return true;
for (int i = 0; i < strlen(s); ++i)
{
if (s[i] == '0' && s[i + 1] == '1')
{
return false;
}
}
return true;
}
练习题
468. 验证IP地址
原题链接:468. 验证IP地址