链表中的Java算法

时间:2017-07-03 15:21:36

标签: java algorithm

我有下一个课程:(单链表)

public class class CharNode {
    private char _value;
    private CharNode _next;

    public CharNode(char val, CharNode n) {
        _value = val;
        _next = n;
    }

    public CharNode(char val) {
        _value = val;
        _next = null;
    }

    public int getValue() {
        return _value;
    }

    public CharNode getNext() {
        return _next;
    }

    public void setValue(char v) {
        _value = v;
    }

    public void setNext(CharNode node) {
        _next = node;
    }
}

和这堂课:

public class CharList {
private CharNode _head;

public CharList()
{
    _head = null;
}
 //methods
}

我需要编写一个方法(称为“what”),它获取两个char并返回以这些char开头和结尾的可能列表的数量。 例如,如果链接列表是“abbcd”方法,那么(a,b)将返回2和方法(a,c)将返回1.我看到了下一个解决方案:

public int what(char start, char end) 
{
    int count = 0, countStart = 0;
    CharNode temp = _head;

    while(temp != null)
    {
        if(temp.getValue() == start){
            countStart++;
            temp = temp.getNext();
            if(temp.getValue() == start && start == end)
                countStart++;
        }

        if(temp.getValue() == end && countStart>0){
            count += countStart;
        } 

        temp = temp.getNext();
    }

    return count;
}

但问题是我无法理解他们如何获得算法。换句话说,它是如何工作的“数学”?

5 个答案:

答案 0 :(得分:1)

您发布的答案算法:

每次找到开始字符时,都会增加“找到的开始次数”的计数器。

然后,每当你找到'结束'字符时,你就知道你必须添加当前的单词计数器,对应于在这个'结束'字符之前找到的'start'字符的数量。

示例:

对于此字符串:' ababab '

  • 第一个'b'会给我们一个字,因为他在
  • 之前只有1'a'
  • 第二个'b'会给我们2个单词,因为他在
  • 之前有2个'a'
  • 第三个'b'会给我们3个单词,因为他在
  • 之前有3个'a'

答案 1 :(得分:0)

此方法通过传递 start end 字符,在List中搜索给定的两个字符。

public int what(char start, char end)

计数变量用于计算该对字符的出现和重复的总次数(开始和结束字符)。因此,如果我们在ab中查找abcabc,则计数会增加两倍,因为它会发现两次ab对。

int count = 0,

并计算一个出现,以防它可以通过两个测试,这两个测试是开始&我们使用:

找到结尾的字符,然后是彼此
countStart = 0;

程序从列表的头部开始并继续搜索,直到没有下一个节点!这意味着temp.getNext()将返回null!

CharNode temp = _head;
while(temp != null)
   .....................
   CharNode temp = _head;

现在对于每个当前值,如果它是开始字符,则继续并开始计数。否则,在所有情况下 - 只要有下一个节点 - 获取下一个节点temp = temp.getNext();

然后检查下一个节点,并将其分配给temp,如果它的当前值(下一个节点的当前值)等于start char AND start char类似于end char符合用户的request =,例如:search for {{ 1}}在aa中,也会增加abcaad以宣布找到它并将其包含在最终结果中。

startCounter

现在,我们仍然在下一个节点,所以它的值应该等于结束字符,无论开始和结束字符是否相似。但是要在结束字符之前包含start char的出现是强制性的,我们需要检查if(temp.getValue() == start && start == end) countStart++; } 是否大于零,这意味着已经找到了前一个开始字符。 如果是这样,请将一个匹配项添加到总计并增加总计数。

countStart

最后返回总计数

if(temp.getValue() == end && countStart>0){
        count += countStart;
} 

答案 2 :(得分:0)

好吧,让我们看一下代码的各个部分。

MacOS  ~/Library/Caches/heroku/error.log
Windows %LOCALAPPDATA%\heroku\error.log
Linux/Other ~/.cache/heroku/error.log (or XDG_CACHE_HOME if set)

上面的代码只是简单的初始化。

int count = 0, countStart = 0;
CharNode temp = _head;

上面的代码遍历你的列表。

while(temp != null)
{
 // ....
    temp = temp.getNext();
}

上面的代码记录了到目前为止有多少个可能的起始位置。

    if(temp.getValue() == start){
        countStart++;

上面的代码说,当有一个结束字符时,计数会增加到目前为止的起始字符数。 (检查 if(temp.getValue() == end && countStart>0){ count += countStart; } 是否真的没有必要,因为如果它是0,你只需加0,但它不会伤害任何东西。)这是有道理的 - 如果你有countStart>0那么aaa就会增加3种可能性。

b

上面的代码似乎是试图考虑起始和结束字符相同的特殊情况。我不相信这部分代码是正确的 - 坦率地说,我认为它在开始和结束不同的情况下引入了错误,使用了 temp = temp.getNext(); if(temp.getValue() == start && start == end) countStart++;

答案 3 :(得分:0)

正如我在评论中所述,他们的实施对我来说有点奇怪。希望我的更有意义。

我们的想法是简单地迭代直到找到有效的起始字符,然后从那时开始计算所有有效的终点。在你到达列表末尾之前一直这样做。

public int what(char start, char end) 
{
    int count = 0;
    CharNode currentNode = _head;

    while(currentNode != null)
    {
        if(currentNode.getValue() == start)
        {
            CharNode potentialEnd = currentNode.getNext();

            while (potentialEnd != null)
            {
                if(potentialEnd.getValue() == end) count++;

                potentialEnd = potentialEnd.getNext();
            }
        }
        currentNode = currentNode.getNext();
    }

    return count;
}

Here's a runnable example

答案 4 :(得分:0)

这是一个在线性时间内完成相同操作的版本,它可以帮助您了解您的版本: (我没有测试它,所以我希望它有效)

public int what (char start, char end) {
    int count = 0, res = 0;
    for (CharNode p = _head; p != null; p = p.getNext())
        if (p.getValue() == start)
            count++;
        else if (p.getValue() == end)
            res += count;
    return res;
}