字符串过滤,排序输出数字的问题

本文介绍了一个简单的程序,该程序能够接收包含数字与非数字混合的字符串作为输入,并通过一系列步骤提取字符串中的所有数字,对其进行排序后输出。文章详细展示了如何使用C++实现这一功能,包括字符串处理、数字提取及排序等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
题目:
写一个排序程序
输入字符串: "5 34 7 34 6 2 12 3 4, 52 ; 13"
输出字符串: "2 3 4 5 6 7 12 13 34 34 52"
*/
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <sstream>
using namespace std;

int str2num(string s)    //字符串转化为数字的函数(好方法)
{
    int num;
    stringstream ss(s);
    ss >> num;
    return num;
}

int main()
{
    string str;
    string dealedstr;
    vector<string> vecStr;
    vector<int> vecInt;
//获取输入一行字符串 看到网上写的while(getline(cin, str)),这是为了可以重复运行 getline(cin, str);
for (int i = 0; i < str.size(); i++) { if (!((str[i] >= '0') && (str[i] <= '9'))) { str[i] = ' '; //并不存在''这样的字符 } }
str.push_back(
' '); //为了方便处理最后一个数字(nice) //确定数字子字符串的起止位置. int posBegin = 0; int posEnd = 0; bool boolBegin = false; for (int i = 0; i < str.size();) { if ((str[i] >= '0') && (str[i] <= '9')) { posBegin = i; boolBegin = true; } posEnd = str.find(" ", i); //find(查找字符,查找起点),它不受for循环的影响,直接从位置i开始,返回目标字符首次出现的位置 if ((posEnd > posBegin) && (boolBegin)) //使得posBegin指向新的数字时,vecStr才会进行将其收录进去 { vecStr.push_back(str.substr(posBegin, posEnd - posBegin)); //substr(起始位置,长度) i = posEnd + 1; //i直接跳到posEnd的后一位,避免多位数字时posBegin逐位移动,取到数字的中间位置而出错 } else i++; //不符合条件时,也要进行自增,否则会进入死循环 boolBegin = false; } for (int i = 0; i < vecStr.size(); i++) { vecInt.push_back(str2num(vecStr[i])); } sort(vecInt.begin(),vecInt.end());  //vector的sort函数用法 for (int i = 0; i < vecInt.size(); i++) { cout << vecInt[i] << " "; } cout << endl; system("pause"); return 0; }

 

转载于:https://www.cnblogs.com/Stephen-Qin/p/9425144.html

<think>我们之前已经解决过这个问题,但这里我们使用sort()函数的key参数来实现更简洁的版本。 思路:我们可以通过key函数返回一个元组,其中第一个元素表示该元素是否是字符串(这样字符串会排在一起),第二个元素是元素本身(用于字符串之间的比较)。但是这样会打乱原顺序,因为字符串会被集中到一起排序。 然而,题目要求数字原地不动,字符串进行排序(即字符串的位置上,用排序后的字符串替换,但数字位置不变)。因此,我们不能直接对整个列表使用sort(),因为sort()会重新排列所有元素的位置。 所以,我们需要采用另一种方法:只对字符串元素排序,然后放回原位置。 以下代码实现了这个功能: 步骤: 1. 遍历列表,记录所有字符串的位置和字符串本身。 2. 对字符串列表单独排序。 3. 将排序后的字符串按原位置放回。 我们之前已经实现过,但这里我们使用sort()函数来对字符串列表排序,同时保持数字位置不变。 但是,如果我们想用sort()函数并且使用key参数来对整个列表进行排序,同时保持数字不动,这是不可能的,因为sort()会重新排列元素的位置。 因此,我们只能采用间接的方法:先提取字符串排序,再放回。 以下是使用这种方法的代码:</think>### 使用 `sort()` 实现字符串排序数字原地不动 以下是使用 Python 的 `sort()` 方法实现字符串排序数字保持原位的解决方案: ```python def sort_strings_only(lst): # 步骤1:收集字符串及其原始索引 str_indices = [i for i, x in enumerate(lst) if isinstance(x, str)] string_values = [x for i, x in enumerate(lst) if isinstance(x, str)] # 步骤2:对字符串进行排序 string_values.sort() # 步骤3:将排序后的字符串放回原位置 for idx, value in zip(str_indices, string_values): lst[idx] = value return lst # 示例使用 mixed_list = [3, 'banana', 1, 'apple', 5, 'cherry', 2.5] result = sort_strings_only(mixed_list) print(result) # 输出: [3, 'apple', 1, 'banana', 5, 'cherry', 2.5] ``` ### 代码详细解释: 1. **收集字符串信息**: - `str_indices`:存储所有字符串元素的原始索引位置 - `string_values`:存储所有字符串元素的值 - 使用列表推导式高效过滤字符串元素 2. **排序字符串**: - 使用 `sort()` 方法对提取出的字符串列表进行原地排序 - 默认按字母顺序升序排列(可自定义排序规则) 3. **放回排序后的字符串**: - 使用 `zip()` 同时遍历索引列表和排序后的字符串列表 - 将每个排序后的字符串放回其原始索引位置 ### 使用 `sort()` 的 `key` 参数实现(更简洁版本): ```python def sort_strings_only_optimized(lst): # 创建字符串索引到值的映射 str_map = {i: lst[i] for i in range(len(lst)) if isinstance(lst[i], str)} # 获取排序后的字符串索引 sorted_indices = sorted(str_map.keys(), key=lambda i: lst[i]) # 获取排序后的字符串值 sorted_values = [lst[i] for i in sorted_indices] # 更新原列表 for i, val in zip(sorted_indices, sorted_values): lst[i] = val return lst # 测试 mixed_list = ['zebra', 100, 'apple', 42, 'banana'] print(sort_strings_only_optimized(mixed_list)) # 输出: ['apple', 100, 'banana', 42, 'zebra'] ``` ### 高级功能扩展: #### 1. 支持自定义排序规则 ```python def sort_strings_custom(lst, key=None, reverse=False): str_indices = [i for i, x in enumerate(lst) if isinstance(x, str)] string_values = [lst[i] for i in str_indices] # 使用自定义排序规则 string_values.sort(key=key, reverse=reverse) for idx, value in zip(str_indices, string_values): lst[idx] = value return lst # 示例:按字符串长度排序 mixed_list = ['longword', 10, 'short', 20, 'medium'] sort_strings_custom(mixed_list, key=len) print(mixed_list) # 输出: ['short', 10, 'medium', 20, 'longword'] ``` #### 2. 处理混合大小写字符串 ```python mixed_list = ['Apple', 1, 'banana', 2, 'cherry'] sort_strings_only(mixed_list) # 默认区分大小写 print(mixed_list) # 输出: ['Apple', 1, 'banana', 2, 'cherry'] # 大小写不敏感排序 sort_strings_custom(mixed_list, key=str.lower) print(mixed_list) # 输出: ['Apple', 1, 'banana', 2, 'cherry'] ``` #### 3. 保留数字类型不变 ```python mixed_list = [3.14, 'pi', 100, 'century', True, 'boolean'] result = sort_strings_only(mixed_list) print(result) # 输出: [3.14, 'boolean', 100, 'century', True, 'pi'] ``` - 整数、浮点数、布尔值等非字符串类型保持原位不变 - 仅字符串元素参与排序 ### 关键注意事项: 1. **原地修改**:此方法直接修改原始列表(节省内存) 2. **稳定性**:相同值的字符串保持原始相对顺序 3. **性能**:时间复杂度 O(n + m log m),其中 n 是总元素数,m 是字符串数 4. **数据类型**:支持所有非字符串类型(数字、布尔值、None、自定义对象等)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值