Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.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
Java 如何使用int数组作为顺序对char数组重新排序,而在O(n)中没有任何额外的空间?_Java_Arrays_Sorting - Fatal编程技术网

Java 如何使用int数组作为顺序对char数组重新排序,而在O(n)中没有任何额外的空间?

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

这是一个电话采访问题:

在适当位置重新排列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',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;
}