开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第8天,点击查看活动详情
[1694. 重新格式化电话号码]
做法:
1.首先需要删除所有的空格和破折号-,用字符串str记录删除后的结果
2.定义一个结果字符串res, 然后遍历str字符串,每三个数字添加一个-
3.最后判断一下倒数第二个位置是否是-,若是,将倒数第二个位置和倒数第三个位置互换
- 因为可能出现下面的字符串: str:
1234567-> 每三个数字都添加一个-: res:123-456-7 - 而此时按照题目要求:最后剩余4 个数字:拆成两个分别含 2 个数字的块
class Solution {
public:
string reformatNumber(string number) {
string str, res;
//1.先删除所有的空格和破折号
for (auto &s : number)
{
if (s != ' ' && s != '-') str += s;
}
res += str[0];//!!!注意先添加一个字符!!
for (int i = 1; i < str.size(); ++i)
{
//每逢3个数字就添加一个'-'区分
if (i % 3 == 0)
res += '-';
res += str[i];
}
//例如:1234567 -> 123-456-7 如果最后剩下4个数字就会出现这种情况
//此时需要将倒数第二个字符和倒数第三个字符交换123-456-7 -> 123-45-67
if (res[res.size() - 2] == '-')
swap(res[res.size() - 2], res[res.size() - 3]);
return res;
}
};
[1784. 检查二进制字符串字段]
首先题目是不含前导0的 -> 即第一个字符一定是1 s[0] = '1'
现在我们需要判断字符串中是否只包含零个或一个由连续个1 组成的字段
- 字符串 s 中包含零个由连续 1组成的字段,那么整个串的表示为0000....000
- 字符串 s 中只包含一个由连续 1 组成的字段,因为已知字符串 s 不包含前导零,所以整个串的表示为11....100...0
那么可以看到两种情况中都不包含 01 串,所以我们可以通过原字符串中是否有 01 串来判断字符串中是否只包含零个或一个由连续 11 组成的字段,如果有 0101 串则说明该情况不满足,否则即满足该情况条件
只要后面出现一个1并且前面一个字符不是1,就是false了 简单来说就是s中有“01”就不满足条件,即:除了第一个“1”,每一个“1”前面都应该是“1”,简而言之,0 后面不能有 1
写法1:
class Solution {
public:
bool checkOnesSegment(string s) {
char pre = s[0];
for(int i = 1;i<s.size();i++)
{
//前一个字符是字符0 当前字符是字符1 出现01串
if(pre == '0' && pre != s[i])
{
return false;
}
pre = s[i];
}
return true;
}
};
写法2: 直接调用find函数找 01串 如果没有找到返回的就是npos (-1)
class Solution {
public:
bool checkOnesSegment(string s) {
return s.find("01") == string::npos;
}
};