gpt4 book ai didi

c++ - 用单词和数字按字母顺序排列字符串

转载 作者:太空狗 更新时间:2023-10-29 21:38:17 26 4
gpt4 key购买 nike

我想弄清楚如何按字母顺序排列包含单词和数字的单个字符串。正如您在下面看到的,我试过使用 isdigit 但有些数字是负数,所以我的代码总是错误的。此外,我的代码将字符串拆分为单独按字母顺序排列的子字符串,但我不知道如何将所有单词分别按字母顺序排列,将它们放回 vector 中的位置,然后将所有数字分别按字母顺序排列,然后放回去进入他们的位置。有人可以帮忙吗?

编辑:

示例输入#1:

4 dog 1 -3 0 cat 3

示例输出#1:

-3 cat 0 1 3 dog 4

示例输入#2:

tom 4 0 9 kid pie 1

示例输出#2:

kid 0 1 4 pie tom 9

到目前为止,我的代码如下所示:

vector<string> numbers; 
string str;
string x;
getline (cin, str);
stringstream ss(str);
while (ss >> x){
numbers.push_back(x);
}

if (numbers.size()==1){
cout << numbers[0] << endl;
return 0;
}

vector<int> results(numbers.size());
for (int i=0;i<numbers.size();i++){
char *a=new char[numbers[i].size()+1];
a[numbers[i].size()]=0;
memcpy(a,numbers[i].c_str(),numbers[i].size());
if(isdigit(*a)==0)
{
results[i]=1;
} else{
results[i]=0;
}
}

int j=0;
while (j<numbers.size()){
int k=j+1;
while (k<numbers.size()){
while (results[j]==results[k]){
sort(numbers.begin()+j,numbers.begin()+k+1);
k++;
}
j=k;
k=numbers.size();
}
if(j==numbers.size()){
for (int i=0; i<numbers.size();i++){
cout << numbers[i] << " ";
}
j++;
}
}

最佳答案

首先,您需要一个函数来确定字符串是否为数字。为此使用 strtol:

#include <stdlib.h> // strtol

bool is_number( const std::string &str, long &num )
{
char *p;
num = strtol( str.c_str(), &p, 10 );
return *p == '\0';
}

在第二个函数中使用这个函数,判断字符串a是否小于字符串b

#include <tuple>

bool sortFunc( const std::string &a, const std::string &b )
{
long numA;
long numB;
bool is_a_num = is_number( a, numA );
bool is_b_num = is_number( b, numB );
return std::make_tuple( !is_a_num, numA, a ) < std::make_tuple( !is_b_num, numB, b );
}

使用std::sort,对std::vector中的字符串进行排序

// include <algorithm> // sort

std::vector< std::string > numbers;
....
std::sort( numbers.begin(), numbers.end(), sortFunc );

另一个解决方案是将 vector 分成两个单独的 vector。一种用于字符串,一种用于数字并分别对它们进行排序:

std::vector< std::string > numbers;
....
std::vector< std::string > vStr;
std::vector< long > vNum;
for ( std::string &str: numbers )
{
long num;
if ( is_number( str, num )
vNum.push_back( num );
else
vStr.push_back( str);
}
std::sort( vNum.begin(), vNum.end() );
std::sort( vStr.begin(), vStr.end() );

如果您想知道每个字符串或数字在原始 vector 中的位置,请使用 std::map

#include <map>

std::vector< std::string > numbers;
....
std::map< std::string, size_t > mapStr; // map string to index of string in vector numbers
std::map< long, size_t > mapNum; // map number to index of number in vector numbers
for ( size_t index = 0; index < numbers.size(); index ++ )
{
long num;
if ( is_number( numbers[index], num ) )
mapNum.emplace( num, index );
else
mapStr.emplace( numbers[index], index );
}

for ( auto & pa : mapNum )
std::cout << pa.first << " pos " << pa.second << std::endl;
for ( auto & pa : mapStr )
std::cout << pa.first.c_str() << " pos " << pa.second << std::endl;

当然你也可以使用一个带有比较函数的std::map:

std::vector< std::string > numbers;
....
std::map< std::string, size_t, bool(*)(const std::string &a, const std::string &b) > mapN( sortFunc );
for ( size_t index = 0; index < numbers.size(); index ++ )
mapN.emplace( numbers[index], index );

for ( auto & pa : mapN )
std::cout << pa.first << " pos " << pa.second << std::endl;

您也可以使用 std::tuple 作为 std::map 的键:

std::vector< std::string > numbers;
....
std::map< std::tuple< bool, long, std::string>, size_t > mapTupleN;
for ( size_t index = 0; index < numbers.size(); index ++ )
{
long num;
bool is_num = is_number( numbers[index], num );
mapTupleN.emplace( std::make_tuple( !is_num, num, numbers[index] ), index );
}
for ( auto & pa : mapTupleN )
{
if ( !std::get<0>(pa.first) )
std::cout << std::get<1>(pa.first) << " is number at position " << pa.second << std::endl;
else
std::cout << std::get<2>(pa.first).c_str() << " is string at position " << pa.second << std::endl;
}

关于c++ - 用单词和数字按字母顺序排列字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35666406/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com