从java中的两个链表堆栈中减去数字
Posted
技术标签:
【中文标题】从java中的两个链表堆栈中减去数字【英文标题】:Subtract numbers from two linked list stack in java 【发布时间】:2021-12-20 13:18:19 【问题描述】:最小的可重现示例:
int borrow = 0;
int valueOne = 2;
int valueTwo = 5;
int sub;
if(valueOne > valueTwo)
sub = borrow + valueOne - valueTwo;
else
sub = borrow + valueTwo - valueOne;
if (sub < 0)
borrow = -1;
sub += 10;
else
borrow = 0;
System.out.format("borrow: %d; sub: %d.%n", borrow, sub);
预期输出:
借用:-1;子:7。
观察到的输出:
借:0;子:3。
我有两个不使用集合的链表堆栈实现。此方法应该处理任何长度的数字并减去它们。该方法在过程中没有任何借用时有效,但在减法需要借用时无效。当减法需要借用时,我无法弄清楚逻辑!任何帮助
方法如下
public static void subtractRoutine(String operndOne, String operndTwo)
int sub =0, borrow =0, valueOne, valueTwo;
pushToLsLeft(padZero(operndOne, operndTwo)[ZERO]);
pushToLsRight(padZero(operndOne, operndTwo)[ONE]);
// System.out.println(left);
left.reverseLinkLsStack();
right.reverseLinkLsStack();
while(left.sizeLinkedLs() > ZERO && right.sizeLinkedLs() > ZERO)
valueOne = Character.getNumericValue(left.pop());
valueTwo = Character.getNumericValue(right.pop());
// --------------------------- please, only focus on the logic below. Everything above works fine.
if(valueOne > valueTwo)
sub = borrow + valueOne - valueTwo;
else
sub = borrow + valueTwo - valueOne;
// System.out.println(sub);
if (sub < 0)
borrow = -1;
sub += 10;
else
borrow = 0;
// System.out.println(sub);
result.push(sub);
如果我输入这个
250 + -150
-250 + 150
120 + -50
输出将是
250
-150
0100
-250
150
-0100
// the problem is here
120
-50
0130
【问题讨论】:
很难说。你能create a minimal reproducible example 让我们尝试运行你的代码吗?这将有助于找出问题所在。 @OleV.V.抱歉,由于为此使用了多种方法,因此可能很难创建最小的复制。我了解其重要性,但感谢您的帮助。 【参考方案1】:所以基于@Ole V.V.这里的答案是我的问题的有效解决方案。
首先,我有一个 if 条件,我在其中切换值 1 和 2 的位置。这不是减法的工作方式。我必须将值保持在相同的位置。
删除了这个
if(valueOne > valueTwo)
sub = borrow + valueOne - valueTwo;
else
sub = borrow + valueTwo - valueOne;
其次,我在开始减法之前反转了堆栈,导致从左到右开始,但正确的顺序应该是从右到左。
最后,减法顺序不正确。我需要先减去数字,然后检查数字是否低于零,这意味着需要借用,然后将借用设置为 -1。完成所有操作后,将堆栈反转为以正确顺序出现的结果。
正确答案
public void subtractRoutine(String operndOne, String operndTwo)
int sub =0, borrow =0, valueOne, valueTwo;
pushToLsLeft(padZero(operndOne, operndTwo)[ZERO]);
pushToLsRight(padZero(operndOne, operndTwo)[ONE]);
while(left.sizeLinkedLs() > ZERO && right.sizeLinkedLs() > ZERO)
valueOne = Character.getNumericValue(left.pop());
valueTwo = Character.getNumericValue(right.pop());
sub = borrow + valueOne - valueTwo;
if (sub < 0)
// when you borrow you need to add 10
sub = 10 + valueOne - valueTwo;
// set borrow to -1 so the number been borrowed from cancelled out
borrow = -1;
else
borrow = 0;
result.push(sub);
// at the end reverse the numbers in the stack
result.reverseLinkLsStack();
【讨论】:
您可能会考虑将最右边(最低有效)的数字始终放在列表的前面(头部),而不是颠倒算术运算的列表? 我不确定我是否理解正确,但最右边的数字不是第一个进入堆栈的元素吗?你指的是改变我的堆栈中推送的工作方式吗?【参考方案2】:你的问题在这里:
sub = borrow + valueTwo - valueOne;
在你应该从 2 中减去 5 的情况下,这需要我们借用,你正在交换值并从 5 中减去 2。这是错误的,并在您的结果中给出了错误的 3,即 130。并且还导致我们不按应有的方式借用。
你根本不需要这个if
-else
声明:
if(valueOne > valueTwo)
无论哪个数字更大,减法都应该相同。只有借用部分会有所不同,具体取决于您是否首先获得负差异。
【讨论】:
以上是关于从java中的两个链表堆栈中减去数字的主要内容,如果未能解决你的问题,请参考以下文章