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