import java.util.Scanner;
class same
{static void anagram(String s1,String s2)
{int p=0;
char[] c1=s1.toCharArray();
char[] c2=s2.toCharArray();
if(s1.length()!=s2.length())
{
System.out.println("not anagram");
System.exit(0);
}
for(int i=0;i<s1.length();i++)
{
for(int j=0;j<s1.length();j++)
{
if(c1[i]==c2[j])
c2[j]='\\';
}
}
while
( p<s2.length()&&c2[p]=='\\')
{
p=p+1;
}
if(p==s2.length())
System.out.println("anagram");
else
System.out.println("non anagram");
}
public static void main(String[] args)
{Scanner input=new Scanner(System.in);
System.out.println("enter the two strings");
String s1=input.next();
String s2=input.next();
anagram(s1,s2);
}}
此代码检查两个字符串是否为anagram。
你能告诉我这段代码的表现吗?它是否冗长(时间复杂)?
或者我应该提高代码的质量? 并且还有以前的建议。这是我的第一篇文章,我是java的新手。
答案 0 :(得分:0)
由于您不会迭代任何动态长度,但所有迭代的限制都是4,因此代码的复杂性为...... O(1)
。
答案 1 :(得分:0)
我尝试了两种方法,A按字母顺序排列两个字符串的字符并比较结果,B计算两个字符串中的每个字符并比较计数。关于可读性,我更喜欢A over B.
public boolean isAnagramA(String a, String b) {
if (a.length() != b.length()) {
return false;
}
char[] aAsArray = a.toUpperCase().toCharArray();
char[] bAsArray = b.toUpperCase().toCharArray();
Arrays.sort(aAsArray);
Arrays.sort(bAsArray);
return Arrays.equals(aAsArray, bAsArray);
}
public int numberOf(char needle, char[] haystack) {
int count = 0;
for (int i = 0; i < haystack.length; i++) {
if (haystack[i] == needle) {
count++;
}
}
return count;
}
public boolean isAnagramB(String a, String b) {
if (a.length() != b.length()) {
return false;
}
char[] aAsArray = a.toUpperCase().toCharArray();
char[] bAsArray = b.toUpperCase().toCharArray();
for (int i = 0; i < aAsArray.length; i++) {
if (numberOf(aAsArray[i], aAsArray) != numberOf(aAsArray[i], bAsArray)) {
return false;
}
}
return true;
}
public void run() {
{
long start = System.nanoTime();
System.out.println(isAnagramA("OTTO", "TOT"));
System.out.println(isAnagramA("OTTO", "TOTO"));
System.out.println(isAnagramA("LOTTO", "TOLLO"));
System.out.println(isAnagramA("yarm", "army"));
System.out.println(isAnagramA("Yarm", "Army"));
System.out.println(isAnagramA("SMAISMRMILMEPOETALEVMIBVNENVGTTAVIRAS",
"AltissimvmPlanetamTergeminvmObservavi"));
System.out.println((System.nanoTime() - start) + " ns for 6 x A");
}
{
long start = System.nanoTime();
System.out.println(isAnagramB("OTTO", "TOT"));
System.out.println(isAnagramB("OTTO", "TOTO"));
System.out.println(isAnagramB("LOTTO", "TOLLO"));
System.out.println(isAnagramB("yarm", "army"));
System.out.println(isAnagramB("Yarm", "Army"));
System.out.println(isAnagramB("SMAISMRMILMEPOETALEVMIBVNENVGTTAVIRAS",
"AltissimvmPlanetamTergeminvmObservavi"));
System.out.println((System.nanoTime() - start) + " ns for 6 x B");
}
{
long start = System.currentTimeMillis();
for (int i = 0; i < 1000000; i++) {
isAnagramA("SMAISMRMILMEPOETALEVMIBVNENVGTTAVIRAS", "AltissimvmPlanetamTergeminvmObservavi");
}
System.out.println((System.currentTimeMillis() - start) + " ms for 1000000 x A");
}
{
long start = System.currentTimeMillis();
for (int i = 0; i < 1000000; i++) {
isAnagramB("SMAISMRMILMEPOETALEVMIBVNENVGTTAVIRAS", "AltissimvmPlanetamTergeminvmObservavi");
}
System.out.println((System.currentTimeMillis() - start) + " ms for 1000000 x B");
}
}
方法run()用于测试它是否有效(不是JUnit,只是输出)以及哪种方式更快,这是输出:
false
true
false
true
true
true
579384 ns for 6 x A
false
true
false
true
true
true
252453 ns for 6 x B
1310 ms for 1000000 x A
1333 ms for 1000000 x B
起初A似乎慢两倍,但比检查Galileo Galilei的字谜循环1000000次显示几乎没有性能差异(希望它不是由于编译器优化)。
我同意其他评论者关于首先关注正确性和可读性以及只有在真正需要的情况下才能进行研究优化。