4.17模拟练习
模拟 · 例1-字符串展开
https://ac.nowcoder.com/acm/contest/20960/1001
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; // 程序结束 }#include <bits/stdc++.h> // 包含所有标准库的头文件
错误:
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还在减导致一个死循环。