如何解决交换问题
我正在解决一个问题,问题描述是:
给定一个数字 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
的情况。
解决方法
正如@molbdnilo 提到的,您的 import os,inspect
songs_df.to_csv("songs_info.csv")
os_dir = os.path.dirname("songs_info.csv")
print(os_dir)
变量只是您的 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;}
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。