从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中的两个链表堆栈中减去数字的主要内容,如果未能解决你的问题,请参考以下文章

C - 堆栈分配的链表

用Java语言实现单向链表

如何从链表中反转堆栈?

菜鸟的算法入门:java的链表操作

Leetcode 两个数字相加 Q:如何从一个数字创建链表?

Java每日一题——> 剑指 Offer II 025. 链表中的两数相加