我最近接受了一个测验,要求我确定数组中的元素是否为字谜。我完成了一个实现,但是在运行测试时,我只通过了5个测试用例中的一个。问题是,他们不会让我看到测试是什么,所以我真的不确定我失败了。我在下面重新创建了我的答案,它基本上将字母中的字母相乘,并将此数字添加到数组中。然后它将一个数组中的数字与另一个数组中的数字进行比较,如果它们相同则打印为true。我基本上会问这会失败的情况,以及如何修改此代码以解决这些问题?
public class anagramFinder {
public static void main (String[] args){
String[] listOne = new String[5];
listOne[0] = "hello";
listOne[1] = "lemon";
listOne[2] = "cheese";
listOne[3] = "man";
listOne[4] = "touch";
String[] listTwo = new String[5];
listTwo[0] = "olleh";
listTwo[1] = "melon";
listTwo[2] = "house";
listTwo[3] = "namer";
listTwo[4] = "tou";
isAnagram(listOne,listTwo);
}
public static void isAnagram(String[] firstWords, String[] secondWords){
int firstTotal = 1;
int secondTotal = 1;
int[] theFirstInts = new int[firstWords.length];
int[] theSecondInts = new int[secondWords.length];
for(int i = 0;i<firstWords.length;i++){
for(int j = 0;j<firstWords[i].length();j++){
firstTotal = firstTotal * firstWords[i].charAt(j);
}
theFirstInts[i] = firstTotal;
firstTotal = 1;
}
for(int i = 0;i<secondWords.length;i++){
for(int j = 0;j<secondWords[i].length();j++){
secondTotal = secondTotal * secondWords[i].charAt(j);
}
theSecondInts[i] = secondTotal;
secondTotal = 1;
}
for(int i=0;i<minimum(theFirstInts.length,theSecondInts.length);i++){
if(theFirstInts[i] == theSecondInts[i]){
System.out.println("True");
} else {
System.out.println("False");
}
}
}
public static int minimum(int number,int otherNumber){
if(number<otherNumber){
return number;
} else {
return otherNumber;
}
}
}
在我上面的例子中,我在main方法中运行,这打印True True False False False,这是正确的
答案 0 :(得分:2)
从类似的问题中复制我的答案。
这是一个简单的快速O(n)解决方案,不使用排序或多个循环或哈希映射。我们增加第一个数组中每个字符的计数,并减少第二个数组中每个字符的计数。如果生成的计数数组充满零,则字符串为字谜。可以通过增加计数数组的大小来扩展为包含其他字符。
class AnagramsFaster{
private static boolean compare(String a, String b){
char[] aArr = a.toLowerCase().toCharArray(), bArr = b.toLowerCase().toCharArray();
if (aArr.length != bArr.length)
return false;
int[] counts = new int[26]; // An array to hold the number of occurrences of each character
for (int i = 0; i < aArr.length; i++){
counts[aArr[i]-97]++; // Increment the count of the character at i
counts[bArr[i]-97]--; // Decrement the count of the character at i
}
// If the strings are anagrams, the counts array will be full of zeros
for (int i = 0; i<26; i++)
if (counts[i] != 0)
return false;
return true;
}
public static void main(String[] args){
System.out.println(compare(args[0], args[1]));
}
}
答案 1 :(得分:1)
乘以ASCII码的想法并不坏,但并不完美。需要进行深入分析,以显示两个不同的单词可以具有相同的产品,给定范围为“a”到“z”,并且在合理的长度内。
一种传统的方法是创建一个用于计算字母的地图,并比较地图。
另一个人会对字母进行排序并比较排序的字符串。
第三个将迭代第一个单词的字母,尝试在第二个单词中找到该字母,并用该字母缩小第二个单词。
我想不出第四种方式,但我几乎可以肯定有一种方法; - )
<强>后来强>
嗯,这是第四种方式:将26个素数分配给'a'到'z'和(使用BigInteger)根据单词的字母乘以素数。 Anagrams生产相同的产品。