输入一行字符,只对其中的数字进行排序,其他字符位置不变,用C++解决
时间: 2023-06-26 21:03:46 浏览: 93
你可以使用C++的STL库中的算法来解决这个问题。具体思路是:先将原始字符串中的数字提取出来,排序后再将其放回原始字符串中。
以下是示例代码:
```c++
#include <iostream>
#include <algorithm>
#include <vector>
#include <cctype>
using namespace std;
int main()
{
string str;
getline(cin, str); // 输入一行字符串
vector<int> nums; // 用于存储提取出来的数字
for (auto c : str) {
if (isdigit(c)) {
nums.push_back(c - '0');
}
}
sort(nums.begin(), nums.end()); // 对数字进行排序
int i = 0;
for (auto& c : str) {
if (isdigit(c)) {
c = nums[i++] + '0'; // 将排序后的数字替换回去
}
}
cout << str << endl; // 输出排序后的字符串
return 0;
}
```
需要注意的是,如果需要支持负数,还需要额外处理符号位。
相关问题
有一个数据文件test2-2.in,其中存有一行字符串,将该字符串读到字符数组a中,然后将字符数组a中下标值为偶数的元素从小到大排列,其他元素不变。要求输出重新排序的整个字符以及下标为偶数的元素
好的,我来解答你的问题。
首先,读取数据文件中的字符串并存入字符数组a中可以使用以下代码:
```c++
#include <iostream>
#include <fstream>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 1000;
int main() {
char a[MAXN];
ifstream fin("test2-2.in");
fin >> a;
int len = strlen(a);
fin.close();
// 排序下标为偶数的元素
sort(a, a+len, [](char x, char y) {
return (x % 2 == 0 && y % 2 == 0 && x < y);
});
// 输出排序后的结果
for (int i = 0; i < len; i++) {
cout << a[i];
}
cout << endl;
// 输出下标为偶数的元素
for (int i = 0; i < len; i += 2) {
cout << a[i];
}
cout << endl;
return 0;
}
```
代码中使用了`ifstream`读取数据文件中的字符串,并通过`strlen`获取字符串长度。接着,使用`sort`排序下标为偶数的元素,排序规则是:如果两个元素都是偶数,则按照大小排序;如果其中一个元素是奇数,则不参与排序。最后,分别输出排序后的整个字符和下标为偶数的元素。
注意,这里假设字符串中字符数不超过1000个,你可以根据实际情况适当调整`MAXN`的大小。
英文单词排序 分数 25 作者 张泳 单位 浙大城市学院 本题要求编写程序,输入若干英文单词,对这些单词按长度从小到大排序后输出。如果长度相同,按照输入的顺序不变。 输入格式: 输入为若干英文单词,每行一个,以#作为输入结束标志。其中英文单词总数不超过20个,英文单词为长度小于10的仅由小写英文字母组成的字符串。说一下这题的解决思路
这道题可以使用字符串数组来存储输入的单词,然后使用冒泡排序或者快速排序等排序算法对单词按照长度从小到大进行排序。如果长度相同,可以按照输入的顺序不变,即不需要对长度相同的单词进行排序。最后输出排序后的单词即可。
具体实现步骤如下:
1. 使用一个字符串数组来存储输入的单词,可以使用getline函数逐行读取单词,以#作为输入结束标志。
2. 对字符串数组进行排序,可以使用冒泡排序或者快速排序等算法。在排序时,需要比较单词的长度,如果长度相同,则按照输入的顺序不变。
3. 输出排序后的单词,可以使用循环遍历字符串数组,逐个输出单词。
以下是使用冒泡排序算法对单词进行排序的代码示例:
```C++
#include <iostream>
#include <string>
using namespace std;
int main() {
string words[20]; // 存储单词的字符串数组
int n = 0; // 单词数量
string word;
// 逐行读入单词,以#作为输入结束标志
while (getline(cin, word) && word != "#") {
words[n++] = word; // 存储单词
}
// 冒泡排序
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - i - 1; j++) {
if (words[j].length() > words[j+1].length() ||
(words[j].length() == words[j+1].length() && j > 0 && words[j-1].length() == words[j].length())) {
// 如果前一个单词长度大于后一个单词长度,或者长度相同但前一个单词的位置在后一个单词之后,则需要交换两个单词
string temp = words[j];
words[j] = words[j+1];
words[j+1] = temp;
}
}
}
// 输出排序后的单词
for (int i = 0; i < n; i++) {
cout << words[i] << endl;
}
return 0;
}
```
其中,第一个if语句判断前一个单词的位置是否在后一个单词之后,是为了保证排序的稳定性,即长度相同的单词按照输入的顺序不变。
阅读全文