【问题标题】:permutation algorithm in javajava中的置换算法
【发布时间】:2018-11-20 17:18:33
【问题描述】:

我试图使用 java 进行置换,我注意到我的代码适用于字符串,但相同的算法在数组上无法正常工作

这是字符串的代码

public static void Recurse(String s,int i)
{
    for(int j=i;j<(s.length());j++)
    {   
        s=Swap(s,i,j);
     if(i<(s.length()-1))
     {  
        Recurse(s,i+1); 
     }
        if(i==(s.length()-1))
        {   
            Display(s);        
        }
    }       
}   
   public static String Swap(String newString,int i,int j)
{
    char  newChar[]=newString.toCharArray();
    char temp=newChar[i];
    newChar[i]=newChar[j];
    newChar[j]=temp;

    return String.valueOf(newChar);
}

    public static void Display(String s)
    {
        System.out.println(s);
    }

public static void main(String args[])
{
    String i=new String("123");
    Recurse(i,0);
 }

输出: 123 132 213 231 312 321 工作正常。

那么这里是数组的代码

public static void Recurse(int [] newArray,int i)
{ 
    for(int j=i;j<newArray.length;j++)
    {
    Swap(newArray,i,j);
    if(i<(newArray.length-1))
    {
        Recurse(newArray,i+1);
    }   
    if(i==(newArray.length-1))
    {
        Display(newArray);
    }   

    }   

}

public static void Display(int [] Array)
{
    for(int i: Array)
    {
        System.out.print(i);
    }
    System.out.println();
}


public static void main(String args[])
{
    Recurse(new int[] {1,2,3},0);
}

输出 123 132 312 321 123 132

不能正常工作,所以我想知道这里出了什么问题。

【问题讨论】:

  • 你能贴出Swap方法的代码吗?
  • 我已经重新编辑了代码
  • 您的Array 版本是否使用相同的Swap 方法?
  • 不,数组是使用临时变量交换的,但字符串是不可变的,所以我必须转换为 charArray 然后返回一个新的字符串对象来交换字符串。
  • 你应该避免 String -> char[] -> String 转换。只需对 char[] 和 from/to String 转换以及开头/结尾进行操作。

标签: java arrays string permutation


【解决方案1】:

以下代码的输出似乎是正确的:

public static void recurse(int[] newArray, int i) {
    for (int j = i; j < newArray.length; j++) {
        newArray = swap(newArray, i, j);
        if (i < (newArray.length - 1)) {
            recurse(newArray, i + 1);
        }
        if (i == (newArray.length - 1)) {
            display(newArray);
        }
    }
}

private static int[] swap(int[] a, int i, int j) {
    int[] newArray = a.clone();
    int temp = newArray[i];
    newArray[i] = newArray[j];
    newArray[j] = temp;
    return newArray;
}

public static void display(int[] Array) {
    for (int i : Array) {
        System.out.print(i);
    }
    System.out.println();
}


public static void main(String args[]) {
    recurse(new int[]{1, 2, 3}, 0);
}

输出是: 123 132 213 231 312 321

我只是对swap 方法代码进行了一些更改,我使它类似于您在Strings swap 方法中使用的那个。

【讨论】:

  • 谢谢,这行得通,但是这个交换函数和另一个使它们产生不同输出的函数之间到底有什么区别
  • @user9169047 数组是一个引用类型,在将其传递给方法时,其中的实际值将被更改。并且排列数字的逻辑需要数组处于其早期状态。
【解决方案2】:

字符串是不可变的,所以当Recurse(String s,int i)调用Recurse(s,i+1);时,s的值保持不变。

数组是可变的,所以当Recurse(int [] newArray,int i)调用Recurse(newArray,i+1);时,newArray的值会改变。

这就是他们行为不同的原因。

注意:当我说“值”时,我指的是对象的值,而不是引用变量本身的值。

【讨论】:

    猜你喜欢
    • 2014-12-17
    • 2015-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-09
    • 2019-09-08
    • 1970-01-01
    相关资源
    最近更新 更多