有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java你能解释一下这个字谜函数是如何工作的吗?

我有一个代码,是我从互联网上提取的。它所做的是检查两个字符串是否是字谜。这基本上意味着他们有相同数量的字母,相同种类和数量的字母。例如,“废料”和“垃圾”或“听到”和“兔子”。诸如此类。无论如何,我的问题是我不明白它是如何工作的。如果有人能给我一点见解,那将是有益的!谢谢你们的时间,伙计们!我很感激!这是密码 具体来说。我不明白for循环部分

boolean isAnagram(string s1, string s2) { 
    if (s1.length != s2.length) 
        return false; 
    char [] a1 = s1.toCharArray(); 
    char [] a2 = s2.toCharArray(); 
    for (int i = a1.length - 1; i >= 0; --i) { 
        int j; 
        for (j = a2.length - 1; j >= 0; --j) { 
            if (a1[i] == a2[j]) 
                break; 
            } 
            if (j < 0) 
                return false; 
    } 
    return true; 
}

共 (2) 个答案

  1. # 1 楼答案

    这段代码似乎需要做很多简单的工作,很难完全理解它并验证它是否正常工作

    一个更简单的方法怎么样?按字符对每个字符串进行排序。如果这些字符串是彼此的字谜,那么它们将是相等的。您仍然可以将长度检查作为一种优化,但无论是否进行该检查,代码都会给出正确的结果

    我的Java已经生锈了,所以让我给你一个JavaScript版本。我相信你可以接受这个想法并将其翻译成:

    function isAnagram( s1, s2 ) {
        return(
            s1.length === s2.length  &&
            sortString(s1) === sortString(s2)
        );
    }
    
    function sortString( s ) {
        return s.split('').sort().join('');
    }
    
    function test( s1, s2, expected ) {
        var result = isAnagram( s1, s2 );
        var ok = ( result === expected ? 'OK' : '*FAIL*' );
        console.log( s1, s2, result, ok );
    }
    
    test( 'dog', 'cat', false );
    test( 'bag', 'big', false );
    test( 'bag', 'gab', true );
    test( 'bags', 'gab', false );
    test( 'foobar', 'baroof', true );
    test( 'aaaa', 'abbb', false );
    

    测试给出了以下日志:

    dog cat false OK
    bag big false OK
    bag gab true OK
    bags gab false OK
    foobar baroof true OK
    aaaa abbb false OK
    

    在下面的评论中,G.巴赫提出了一个极好的观点,即其他算法可能比这个算法快很多。如果手头的任务是如上所述的,以确定两个特定字符串是否为字谜,那么性能就不太重要了。即使是这种幼稚的算法也应该足够快

    OTOH,如果你要通过大量的字符串来找出哪些字符串是哪些字符串的字谜,那么性能当然就变得更重要了。即便如此,在“包中”上有这样一个简单易懂的实现也是很有价值的。例如,您可以将这种简单的方法作为测试用例的一部分来验证更快的算法

  2. # 2 楼答案

    在外循环中逐字符遍历第一个字符串。 检查第二个字符串中是否存在该字符,这是在内部循环中完成的。如果不存在,返回false

    就这样。不过,您需要验证它是否能处理所有条件

    理想情况下,您应该能够通过阅读代码或使用一些调试器逐行检查代码来理解此逻辑