https://leetcode.com/problems/letter-combinations-of-a-phone-number/description/
当2到9(含)之间的每个数字都映射到英语字母字符串时,此代码将生成所有可能的字符串。
问题是重新创建手机T9词典,这意味着,如果用户键入23,则应返回字符串“ abc”和“ def”的所有可能组合。
import java.util.*;
import java.lang.*;
import java.io.*;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
public static void main (String[] args) throws java.lang.Exception
{
System.out.println(letterCombinations("23"));
}
private static final String[] KEYS = { "", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz" };
public static List<String> letterCombinations(String digits) {
List<String> ret = new LinkedList<String>(); //this is the local variable.
combination("", digits, 0, ret); //being sent to a method. But that method doesn't have any return type.
return ret; //so, how is this ret being populated????
}
private static void combination(String prefix, String digits, int offset, List<String> ret) {
if (offset >= digits.length()) {
ret.add(prefix);
return;
}
String letters = KEYS[(digits.charAt(offset) - '0')];
for (int i = 0; i < letters.length(); i++) {
combination(prefix + letters.charAt(i), digits, offset + 1, ret);
}
}
}
当ret
方法没有返回类型时,如何设置在letterCombination()
方法中声明和实例化的combination( )
。
答案 0 :(得分:5)
Java按值传递100%,但是,可能出现在值上的对象实际上始终是对对象的引用。这些引用按值传递。 https://stackoverflow.com/a/40523/57695
在诸如C
或C++
之类的语言中,引用具有特殊的语法,但是在Java中,变量仅是引用或基元,因此没有理由具有特殊的语法。
new LinkedList<String>()
不是堆栈上的局部变量。这是堆上的对象。传递引用时,不会将其复制,也不会以某种方式使其变为只读。如果您在其他方法或线程中对其进行修改,则会对其进行更改。
您的ret
局部变量只是对该堆对象的引用。您不能使用其他方法更改该引用,但是可以更改引用的对象。这是因为引用被复制,但是仅引用被复制。
答案 1 :(得分:0)
因为这里的方法调用
combination("", digits, 0, ret); //
此处的参数ret
在下面也引用了ret
对象
List<String> ret = new LinkedList<String>();