Java 如何使用int数组作为顺序对char数组重新排序,而在O(n)中没有任何额外的空间?
这是一个电话采访问题: 在适当位置重新排列charArray,使其与intArray的顺序相匹配 例如: 输入:Java 如何使用int数组作为顺序对char数组重新排序,而在O(n)中没有任何额外的空间?,java,arrays,sorting,Java,Arrays,Sorting,这是一个电话采访问题: 在适当位置重新排列charArray,使其与intArray的顺序相匹配 例如: 输入: intArray: {4,2,3,0,1} charArray:{'A','B','C','D','E'} 预期: 代码应将charArray更改为 {'E','C','D','A','B'} 说明: charArray = [charArray [4] ='E',charArray [2]='C',charArray [3]='D',charArray [0]='A',char
intArray: {4,2,3,0,1}
charArray:{'A','B','C','D','E'}
预期:
代码应将charArray更改为
{'E','C','D','A','B'}
说明:
charArray = [charArray [4] ='E',charArray [2]='C',charArray [3]='D',charArray [0]='A',charArray [1]='B'];
[E, C, D, A, B]
不能使用映射或任何其他额外空间。您只能就地进行更改。一种解决方案是递归地解决此问题。虽然它不分配显式的新数组,但它使用堆栈进行递归,因此它使用隐式空间
public static void main(String[] args) {
int[] a = {4, 2, 3, 0, 1};
char[] c = {'A', 'B', 'C', 'D', 'E'};
System.out.println(c); //ABCDE
solve(a, c, 0, c[a[0]]);
System.out.println(c); //ECDAB
}
private static void solve(int[] a, char[] c, int i, char charValue) {
if (i + 1 < c.length) {
solve(a, c, i + 1, c[a[i + 1]]);
}
c[i] = charValue;
}
publicstaticvoidmain(字符串[]args){
int[]a={4,2,3,0,1};
char[]c={'A','B','c','D','E'};
System.out.println(c);//ABCDE
解(a,c,0,c[a[0]]);
System.out.println(c);//ECDAB
}
私有静态void solve(int[]a,char[]c,int i,char charValue){
如果(i+1
类似于user7的方法,但每次都使用循环查找字符的位置:
公共类解决方案{
公共静态void main(字符串[]args){
字符ch[]=新字符[]{'A','B','C','D','E'};
排列(新的int[]{1,3,2,0,4},ch);
System.out.print(ch);//EDCAB
}
私有静态无效排列(int[]inArr,char[]chrr){
排列(inArr,chrrar,0,0);
}
私有静态无效排列(int[]inArr、char[]chrr、int索引、int计数){
如果(计数==初始长度)
//看到所有元素了吗
返回;
char c=chrArr[索引];
int t=-1;
/*
*找出c属于哪个地方,比如t,然后,
*递归地找到哪个地方
*t处的元素是否属于。
*
*继续,直到看到所有元素(count==数组的长度)
*/
对于(int i=0;i
另一种选择是将intArray用作额外存储:
O(N)
for(int i=0;通过重用输入空间提供很好的解决方案。它看起来不错。但是,一位面试官告诉我,在另一次面试中,永远不要更改解决方案中的输入。尽管递归似乎使用了O(1)额外空间。实际上,此递归解决方案使用了O(N)额外的空间,因为它会重复N次。不确定这是否是面试官所期望的。是的,这是正确的。请参阅链接的重复文章
for(int i=0; i<intArray.length; i++) {
intArray[i] = (int) charArray[intArray[i]];
}
for(int i=0; i<intArray.length; i++) {
charArray[i] = (char) intArray[i];
}
int[] intArray = new int[]{4,2,3,0,1};
char[] charArray = new char[]{'A','B','C','D','E'};
for(int i=0; i<intArray.length; i++) {
intArray[i] |= (charArray[intArray[i]] << 16);
}
for(int i=0; i<intArray.length; i++) {
charArray[i] = (char) (intArray[i] >> 16);
intArray[i] &= 0xFFFF;
}