2

我有这个问题,我必须将十进制数转换为二进制,然后将这些位存储在一个链表中,其中头节点是最高有效位,最后一个节点是最低有效位。解决问题本身实际上很容易,因为您只需要递归地继续取模 2 并将结果添加到列表中,直到十进制数变为 0。

我卡住的地方是我必须编写函数,使其返回最高有效位和最后一个有效位的一对数字(无论是数组还是列表)。即:在函数中输入 14 将返回 (1, 0),因为 14 是二进制的 1110。

我确实可以轻松访问 MSB 和 LSB(getFirst()、getLast())。

该函数只能接受一个参数,即十进制数。

目前我有这个当前代码:

public static void encodeBin(int n) {
    if(n == 0) return; //Base case
    else {
        if(n % 2 == 0)
            theList.addFirst(0);
        else
            theList.addFirst(1);
        encodeBin(n / 2);
    }
    // return?
}

问题是我不知道如何返回 2 个值。有一个返回值意味着我不能自己调用​​ encodeBin() 。

此外,我应该在哪里创建列表?如果我把类似的东西放在List<Integer> = new LinkedList<Integer>()函数的开头,那么每次函数调用自己时,它都会创建一个新列表并在那个新列表中添加位而不是原来的对吗?(从调用函数时创建的列表第一次)

有谁知道如何解决这个问题?

4

3 回答 3

0

您不能分别返回两个值。但是,您可以返回一个包含第一位和最后一位的数组,或者创建您自己的类来保存这些数据,并返回该类的一个实例。


关于列表,我看到两个选项:

  1. 使其成为static类变量
  2. 让它成为函数的参数(尽管我看到你说你不能这样做)。

第一种方法如下所示:

public class MyClass {
    private static List<Integer> theList = new LinkedList<Integer>();

    // `encodeBin` method as you have it
}

第二种方法如下所示:

public static void encodeBin(int n, List<Integer> theList) {
    if(n == 0) return; //Base case
    else {
        if(n % 2 == 0)
            theList.addFirst(0);
        else
            theList.addFirst(1);
        encodeBin(n / 2, theList);
    }
}

然后你可以按照以下方式做一些事情

List<Integer> theList = new LinkedList<Integer>();
encodeBin(14, theList);

并将theList根据需要保存适当的位。


请注意,您可能需要考虑将其设为booleans而不是integers的列表,并使用true表示1false表示0

于 2012-10-25T19:08:16.360 回答
0

您不能返回 2 个值。您将不得不返回一些包含 2 个值的对象。一个数组或一些新对象,取决于你的作业要求和这个函数将在哪里使用。

对于链表的创建,您需要的是一个递归辅助方法。您的公共方法将用于初始化您的对象、开始递归并返回您的结果。这允许您的实际递归函数有多个参数。

public static SOME_TYPE encodeBin(int n) {
  LinkedList result = new LinkedList();
  encodeBin_helper(result,n);
  // return the MSB and LSB
}

public static void encodeBin_helper(LinkedList theList, int n) {
  if(n == 0) return; //Base case
  else {
    if(n % 2 == 0)
        theList.addFirst(0);
    else
        theList.addFirst(1);
    encodeBin_helper(theList, n/2);
  }

}
于 2012-10-25T19:14:33.960 回答
0

我建议声明两种方法:

(1) public static int[] encodeBin(int n) 和 (2) private static void encodeBin(LinkedList, int n)

公共方法只是创建一个空列表,然后调用私有版本,同时传递空列表和原始输入 n 作为参数

像这样的东西:

public static int[] encodeBin(int n) {
  LinkedList<Integer> aList = new LinkedList<Integer>();
  encodeBin(aList , n);
  int MSB = aList.getFirst();
  int LSB = aList.getLast();

  return new int[] {MSB, LSB};
}

private static void encodeBin(LinkedList<Integer> list, n) {
  //your recursive version here
}
于 2012-10-25T19:45:50.103 回答