我有下一个课程:(单链表)
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;
}
但问题是我无法理解他们如何获得算法。换句话说,它是如何工作的“数学”?
答案 0 :(得分:1)
您发布的答案算法:
每次找到开始字符时,都会增加“找到的开始次数”的计数器。
然后,每当你找到'结束'字符时,你就知道你必须添加当前的单词计数器,对应于在这个'结束'字符之前找到的'start'字符的数量。
示例:
对于此字符串:' ababab '
答案 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;
}
答案 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;
}