4.17模拟练习

模拟 · 例1-字符串展开

https://ac.nowcoder.com/acm/contest/20960/1001

#include <bits/stdc++.h> // 包含所有标准库的头文件
using namespace std; // 使用标准命名空间 int p1, p2, p3; // 全局变量,用于存储输入的三个整数参数 string s, ans; // 字符串s用于存储输入的字符串,ans用于存储最终的结果 // 函数solve用于根据给定的字符范围和参数生成展开的字符串 string solve(char l, char r, int p1, int p2, int p3) {     if (r - l == 1) return " "; // 如果左右字符相邻,返回空格     // 如果左右字符不满足字母或数字的顺序关系,返回"-"     if (!((isalpha(l) && isalpha(r) && l < r) || (isdigit(l) && isdigit(r) && l < r))) return "-";          string ans = " "; // 初始化结果字符串,开始有一个空格     for (char i = l + 1; i < r; i++) { // 遍历从l到r之间的字符         while (p2--) // 根据p2的值重复添加字符             ans += i;     }          // 如果p1为2且左右字符都是字母,将结果字符串中的小写字母转换为大写     if (p1 == 2 && isalpha(l) && isalpha(r)) {         for (int i = 0; i < ans.length(); i++) {             ans[i] = ans[i] + 'A' - 'a';         }     }          // 如果p1为3,将结果字符串中的所有字符替换为星号     if (p1 == 3) {         for (int i = 0; i < ans.length(); i++) {             ans[i] = '*';         }     }          // 如果p3为2,反转结果字符串     if (p3 == 2) reverse(ans.begin(), ans.end());          return ans; // 返回处理后的字符串 } int main() {     cin >> p1 >> p2 >> p3; // 读取三个整数参数     cin >> s; // 读取输入的字符串     for (int i = 0; i < s.length(); i++) { // 遍历字符串的每个字符         // 如果当前字符是'-'且前后都有字符,调用solve函数处理         if (s[i] == '-' && i - 1 > 0 && i + 1 < s.length())             ans += solve(s[i - 1], s[i + 1], p1, p2, p3);         else // 否则直接将当前字符追加到结果字符串             ans += s[i];     }     cout << ans; // 输出最终结果字符串     return 0; // 程序结束 }


错误:
1、第一遍写的时候没注意到s串全是小写字母,用了一堆if,else语句;后面看了题解之后学会用isalpha()和isdigit();以及reverse;
2、看完题解自己写的时候
for (char i = l + 1; i < r; i++) { // 遍历从l到r之间的字符
        while (p2--) // 根据p2的值重复添加字符
            ans += i;
    }
用while循环添加字符,这样导致进入了一个死循环,i=l+1时p2--到0或者是负数,后边i++了p2还在减导致一个死循环。
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务