【问题标题】:Problems with swapping交换问题
【发布时间】:2021-06-06 07:26:12
【问题描述】:

我正在解决一个问题,问题描述是:

给定一个数字 N。你必须执行两次交换操作 使数字尽可能大。

给你一个数字 N (10 ≤ N ≤ 2×109)。你必须准确地执行 两次交换操作。你可以选择任意两个不相等的位置 这个数字,然后交换这两个位置的数字。

例如,对于数字 451,您可以选择位置 1 和 2,然后交换这个 交换号码后再次将 541 您可以选择位置 2 和 3 并在交换数变为 514 后交换。

这两个操作后你能得到的最大数是多少?

所以我编写了一个有意义的代码,但我不明白为什么在我的代码swap() 中交换相同的字符。看代码你就明白了。

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    ll t;
    cin>>t;
    while(t--){
        string s;
        cin>>s;
        ll k=2;//Number of minimum swaps
        for(int i=0;i<s.size();i++){
            char ma=s[i];//storing maximum number 
            for(int j=i+1;j<s.size();j++){
                if(ma < s[j]){
                    ma=s[j];
                }
            }
            if(ma != s[i]){
                swap(ma,s[i]);//swaping two chars if I found something bigger than s[i]. This line is also occuring error I mean unexpected behavior
                k--;
            }
            cout<<"Iteration "<<i+1<<" "<<s<<endl;//This line is for inspecting what is going on
        }
    }
}

输入输出:

Input:
1
123
Output:
Iteration 1 323
Iteration 2 333
Iteration 3 333

如果您看到代码,则不应发生这种情况。

请说出swap 的情况。

【问题讨论】:

  • 与您的问题无关,但是...如果您只需要打印结果,您可以对字符串进行排序吗?
  • @silverfox 我无法排序,因为我要交换数字的任意两位数
  • @fabian 抱歉,实际上我忘了编辑。我必须是ma,这将被交换。但是如果我使用ma 而不是c,那么结果也是出乎意料的。
  • 你正在用一个局部变量交换一个字符串元素,但你应该交换两个字符串元素。例如,如果您将s[0] 存储在ma 中,然后将mas[1] 交换,您仍然有相同的值是s[0]。 (打印mas 看看发生了什么。)

标签: c++ algorithm swap


【解决方案1】:

正如@molbdnilo 提到的,您的ma 变量只是您的s[j] 字符的副本。要在这两个字符之间实际切换,您需要使用临时变量来存储j 的位置

int jtmp;
for(int j=i+1;j<s.size();j++)
{
    if(ma < s[j])
    {
        ma=s[j]; jtmp = j;
    }
} 

完整修改代码:

#include <iostream>
#include <string>
#define ll long long
using namespace std;

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    ll t;
    cin>>t;
    while(t--){
        string s;
        cin>>s;
        ll k=2;
        for(int i=0;i<s.size();i++)
        {
            char ma=s[i]; int jtmp;
            for(int j=i+1;j<s.size();j++)
            {
                if(ma < s[j])
                {
                    ma=s[j]; jtmp = j;
                }
            }
            if(ma != s[i])
            {
                swap(s[jtmp],s[i]);
                k--;
            }
            cout<<"Iteration "<<i+1<<" "<<s<<endl;
        }
    }
}

结果:

1
45231
Iteration 1 54231
Iteration 2 54231
Iteration 3 54321
Iteration 4 54321
Iteration 5 54321

添加:您可以看到在字符串排序后您的循环仍然会持续一段时间。这可以通过检查字符串是否已排序的函数来解决。

#include <iostream>
#include <string>
#include <algorithm>
#define ll long long
using namespace std;

bool LF(char a, char b)
{
    return a > b;
}

bool stringCheck(string x)
{
    string y = x;
    sort(y.begin(), y.end(), LF);
    if (y == x) {return true;} return false;
}


int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    ll t;
    cin>>t;
    while(t--){
        string s;
        cin>>s;
        ll k=2;
        for(int i=0;i<s.size();i++)
        {
            char ma=s[i]; int jtmp;
            for(int j=i+1;j<s.size();j++)
            {
                if(ma < s[j])
                {
                    ma=s[j]; jtmp = j;
                }
            }
            if(ma != s[i])
            {
                swap(s[jtmp],s[i]);
                k--;
            }
            cout<<"Iteration "<<i+1<<" : "<<s<<endl;
            if (stringCheck(s)) {break;}
        }
    }
}

结果:

1
45231
Iteration 1 : 54231
Iteration 2 : 54231
Iteration 3 : 54321

【讨论】:

  • 尝试输入12345会发生什么,之​​后k的值是多少?
  • @Surt 很好它输出了 0,但我之前没有注意到 k 变量...
  • 嗯 12345 不是一个好的测试...尝试使用 15432,应该为 k 输出 -2,这超出了允许的交换次数。 (51432, 54132, 54312, 54321)
  • @Surt 啊,我注意到 OP 说 k 是交换的最大数量。但是,我的答案是关于为什么swap() 无论如何都不能正常工作的问题
猜你喜欢
  • 2011-07-15
  • 1970-01-01
  • 2021-11-28
  • 2011-08-14
  • 2020-09-29
  • 2021-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多