Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 通过与第一个整数交换在排列之间移动的算法_Algorithm_Sorting - Fatal编程技术网

Algorithm 通过与第一个整数交换在排列之间移动的算法

Algorithm 通过与第一个整数交换在排列之间移动的算法,algorithm,sorting,Algorithm,Sorting,今天我被问到一个有趣的面试问题。假设您有前n个整数a(例如13425)和另一个整数B(例如43125)的排列。我们必须从第一个置换移动到第二个置换,只需将索引1到n-1的值与索引0的值交换即可 换句话说,我们可以交换13425序列中的指数0和1,得到31425。但我们无法将13425序列中的指数2和3互换为13245 最后,在这些交换之后,我们必须讨论置换B。有谁能想出一个运行时间比O(n^2)更好的算法吗?是的,存在O(n)解决方案,下面是java实现: 私有静态无效交换(int[]idx,c

今天我被问到一个有趣的面试问题。假设您有前n个整数a(例如13425)和另一个整数B(例如43125)的排列。我们必须从第一个置换移动到第二个置换,只需将索引1到n-1的值与索引0的值交换即可

换句话说,我们可以交换13425序列中的指数0和1,得到31425。但我们无法将13425序列中的指数2和3互换为13245

最后,在这些交换之后,我们必须讨论置换B。有谁能想出一个运行时间比O(n^2)更好的算法吗?

是的,存在O(n)解决方案,下面是java实现:

私有静态无效交换(int[]idx,char[]c,inti){
idx[c[i]-'0']=0;
idx[c[0]-'0']=i;
char tc=c[0];
c[0]=c[i];
c[i]=tc;
}
公共静态无效置换(最终字符串从,最终字符串到){
最终整数[]idx=新整数[10];
final char[]c1=from.toCharArray();
final char[]c2=to.toCharArray();
对于(int i=0;i=0;i--){
如果(c2[i]!=c1[i]){
final int charIdx=idx[c2[i]-'0'];
如果(charIdx!=0){
//将字符移动到索引0
掉期(idx、c1、charIdx);
}
//将字符从0移动到i;
互换(idx、c1、i);
}
}
}
是的,存在O(N)解决方案,以下是java实现:

私有静态无效交换(int[]idx,char[]c,inti){
idx[c[i]-'0']=0;
idx[c[0]-'0']=i;
char tc=c[0];
c[0]=c[i];
c[i]=tc;
}
公共静态无效置换(最终字符串从,最终字符串到){
最终整数[]idx=新整数[10];
final char[]c1=from.toCharArray();
final char[]c2=to.toCharArray();
对于(int i=0;i=0;i--){
如果(c2[i]!=c1[i]){
final int charIdx=idx[c2[i]-'0'];
如果(charIdx!=0){
//将字符移动到索引0
掉期(idx、c1、charIdx);
}
//将字符从0移动到i;
互换(idx、c1、i);
}
}
}