给定一个字符串s
,两个数字n
和m
,我必须按降序对两个indeces(包括两者)之间的字符串字符进行排序。
我写了这个程序,但是我没有得到正确的排序字符串。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int t ;
cin >>t ;
while(t--) {
int n ,m ,i ,j;
string s ;
char c ;
cin >> s >> n >> m ;
for(i=n;i<m;i++) {
for(j=n+1;j<=m;j++) {
if( s[j]>s[i] ) {
swap(s[i],s[j]) ;
}
}
}
cout << s << '\n' ;
}
return 0;
}
你能告诉我我的代码有什么问题吗?
答案 0 :(得分:1)
您正在检查是否s[j] > s[i]
- 如果有,则进行交换,即使i < j
。
要解决此问题,您可能希望从i+1
而不是n+1
开始第二个循环。
for(i=n;i<m;i++){
for(j=i+1;j<=m;j++){
// ^ i instead of n
if( s[j]>s[i] ) {
swap(s[i],s[j]) ;
}
}
}
作为旁注,这是非常低效的排序算法。
P.S。确保j<=m
是有意的,你不需要强烈的不平等。
答案 1 :(得分:1)
在这种情况下,我更喜欢使用标准库实用程序,例如
auto mid = s.substr(n, m-n);
std::sort(mid.begin(), mid.end(), std::greater<char>());
std::cout << s.substr(0, n) << mid << s.substr(m, s.size()-m);
所以例如
s = "dictionary"
n = 2
m = 8
会产生
ditonicary
答案 2 :(得分:1)
我是第二个@CoryCramer给出的答案,但是我已经到位了:
#include <string>
#include <iostream>
#include <algorithm>
int main( void )
{
std::string s = "This is the string to sort";
size_t m = 3;
size_t n = 10;
std::sort( s.begin() + m, s.begin() + n );
std::cout << s << '\n';
}
输出:将他的字符串排序
如果没有理由,尽量不要使用原始循环,恕我直言,我的代码比OP建议的代码更具可读性。