【发布时间】:2015-09-13 18:50:46
【问题描述】:
我正在尝试编写一个函数,该函数将一个只有小写字母的字符串数组作为输入。函数返回一个相同字符串的数组,但每个字符串的字母都重新排列,如果可能,它会变成回文,如果不是,则返回 -1。
public static Object buildPalin(String[] arrayOfStrings)
{
String[] palindrome = new String[arrayOfStrings.length];
int offset = 0;
int charWithoutReflection = 0;
List<String> whole= Arrays.asList(arrayOfStrings);
String wholeString = String.join("", whole);
for(int i=0; i< arrayOfStrings.length; i++)
{
if (arrayOfStrings[i] != "")
{
int currentCharPosition = wholeString.indexOf(arrayOfStrings[i],
i + 1);
if (currentCharPosition != -1)
{
palindrome[offset] = arrayOfStrings[i];
palindrome[palindrome.length - 1 - offset] =
arrayOfStrings[i];
arrayOfStrings[currentCharPosition] = "";
arrayOfStrings[i] = "";
}
else {
if (charWithoutReflection > 0)
return -1;
palindrome[palindrome.length/2] = arrayOfStrings[i];
charWithoutReflection++;
}
offset++;
}
}
return palindrome;
}
这个函数适用于输入数组是这样的情况 {“a”、“b”、“a”} {"a","b","c"} 等等。
但是当我有如下输入时: {"aba", "bb", "cac"} 和这样的字符串数组失败了。
对此的任何指导或建议都会有所帮助。
注意: 这不是课堂作业,而是我在面试中被问到的一个问题。 我能够提出上述解决方案,但现在我正试图使其也适用于角落案例。这对以后的面试很有帮助。
===============================根据以下 Eric 的评论更新代码=========
public static Object build(String[] arrayOfStrings) {
String[] palindrome = new String[arrayOfStrings.length];
int offset = 0;
int charWithoutReflection = 0;
List<String> whole= Arrays.asList(arrayOfStrings);
String wholeString = String.join("", whole);
for(int i=0; i< arrayOfStrings.length; i++)
{
if (arrayOfStrings[i] != "") {
int currentCharPosition = wholeString.indexOf(arrayOfStrings[i], i +
1);
if (currentCharPosition != -1)
{
palindrome[offset] = arrayOfStrings[i];
palindrome[palindrome.length - 1 - offset] = arrayOfStrings[i];
arrayOfStrings[currentCharPosition] = "";
arrayOfStrings[i] = "";
}
else {
if (charWithoutReflection > 0)
{
System.out.println("failed case");
return -1;
}
palindrome[palindrome.length/2] = arrayOfStrings[i];
charWithoutReflection++;
}
offset++;
}
}
return palindrome;
}
// code from main function calling above function is:
public static void main(String[] args) {
String a[] = {"abb"};
for ( int j = 0; j < a.length ; j++)
{
String[] tokens = a[j].split("");
System.out.println(Arrays.deepToString((Object[]) build(tokens)));
}
产生错误的输出为 : ( 对于输入 [a,b,b]
[null, b, null] 而不是 [b, a, b]
【问题讨论】:
-
你的代码不可能为
{"a", "b", "a"} {"a","b","c"}工作。这是String的二维数组。你的方法只需要一个一维数组。 -
或者这两个不同的输入数组示例是否有效?这是有道理的。
-
@ErickG.Hagstrom:是的,两个不同的数组示例(不是二维数组)。两者都是不同的输入。只是想展示它工作正常的案例以及哪些案例代码不起作用。
-
wholeString变量的用途是什么?如果您只是想重新排列每个输入String的字母,则无需将所有这些Strings视为一个大String。
标签: java arrays algorithm palindrome