L1-058 6翻了
解题思路
- 思路1
for遍历字符串,记录查询由‘6’开头,查到后进行cnt++,判断有几个‘6’,如果9个‘6’以上的就直接输出‘27’,大于3个‘6’输出‘9’,否则输出cnt个‘6’,若不是由‘6’开头就直接输出s[i]即可
三目运算符可真香,小声bb
归纳一下
a ? b : c;如果a为真,则执行b,否则执行c- 函数
string(n,'c')的功能是:返回由n个字符c组成的字符串
附上代码
#include<bits/stdc++.h>
#define int long long
#define lowbit(x) (x &(-x))
using namespace std;
const int INF=0x3f3f3f3f;
const double PI=acos(-1.0);
const double eps=1e-10;
const int M=1e9+7;
const int N=1e5+5;
typedef long long ll;
typedef pair<int,int> PII;
string s;
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
getline(cin,s);
for(int i=0;i<s.length();i++){
int cnt=0;
while(s[i]=='6'){
i++;
cnt++;
}
cout<<(cnt>9?"27":(cnt>3?"9":string(cnt,'6')));
cout<<s[i];
}
return 0;
}
- 思路2
做完这道题之后我想知道有没有更简便的方法来判断字符串中是否含有x个以上连续的数字,然后我发现了正则表达式这个神仙做法
正则表达式
- 头文件为
<regex> regex_replace()是替换匹配,即可以将符合匹配规则的子字符串替换为其他字符串regex_search()是搜索匹配,即搜索字符串中存在符合规则的子字符串regex_match()是全文匹配,即要求整个字符串符合匹配规则
| 符号 | 作用 |
|---|---|
| + | 前面的元素重复1次或多次 |
| * | 前面的元素重复任意次 |
| ? | 前面的元素重复0次或1次 |
| {n} | 前面的元素重复n次 |
| {n,} | 前面的元素重复至少n次 |
| {n,m} | 前面的元素重复至少n次,至多m次 |
附上代码
#include<bits/stdc++.h>
#define int long long
#define lowbit(x) (x &(-x))
using namespace std;
const int INF=0x3f3f3f3f;
const double PI=acos(-1.0);
const double eps=1e-10;
const int M=1e9+7;
const int N=1e5+5;
typedef long long ll;
typedef pair<int,int> PII;
string s;
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
getline(cin,s);
cout<<regex_replace(regex_replace(s,regex("6{10,}"), "27"),regex("6{4,}"),"9");
return 0;
}

本文探讨了解决L1-0586问题的两种方法:一是使用循环和条件语句逐字符处理,二是利用正则表达式简化流程。通过实例展示了如何用正则表达式高效地替换特定模式的字符串,如连续出现的数字6,优化了代码的可读性和执行效率。

625

被折叠的 条评论
为什么被折叠?



