簡體   English   中英

更改 (A&B) AND 運算符中 A 和 B 的順序時出錯

[英]Error when changing the order of A and B in (A&B) AND operator

以下是用於確定 LinkedList 是否為回文的代碼 為什么此代碼在此行時顯示錯誤 bool isPal = check(p->next) & (temp->val == p->val); 在下面的代碼中寫成 bool isPal = (temp->val == p->val) & check(p->next); 對於輸入[1,0,1]------只是取AND的順序顛倒了

class Solution {
public:
       ListNode* temp;
       bool isPalindrome(ListNode* head) {
           temp = head;
           return check(head);
    }
    
       bool check(ListNode* p) {
           if (NULL == p) return true;
           bool isPal = check(p->next) & (temp->val == p->val);
           temp = temp->next;
           return isPal;
    }
};

解決方案

bool a = check(p->next);
bool b = (temp->val == p->val);
bool isPal = a & b;

這通過故意移動對 check() 的調用來解決這個問題,以便在嘗試計算 temp 的值之前,可以在 check() 調用內部迭代 temp。


解釋

考慮以下:

bool b = (temp->val == p->val);
bool a = check(p->next);
bool isPal = a & b;

temp 的值是在調用 check() 之前計算的,因此在 temp 可以被迭代之前。

分步演練

使用 [1,0,1] 示例,我將逐步執行 check() 的遞歸調用:

  • 調用 isPalindrome() 發生 => temp 設置為 head 然后調用遞歸檢查函數。
  • 第一次調用 check() =>
    • p 是第一個列表元素。
    • temp 是第一個列表元素。
    • (temp->val == p->val) 計算為真,因為它們是相同的元素。 然后調用 check(p->next) 。
  • 第二次調用 check() =>
    • p 是第二個列表元素。
    • temp 是第一個列表元素。
    • (temp->val == p->val) 計算為假,因為 1 != 0。然后調用 check(p->next)。 不會跳過調用,因為我們使用的是 & 運算符而不是 && 運算符。
  • 第三次調用 check() =>
    • p 是第三個列表元素。
    • temp 是第一個列表元素。
    • (temp->val == p->val) 計算為真,因為 1 == 1。然后調用 check(p->next),但 p->next 為 NULL,因為我們在列表的末尾。
  • 第四次調用 check() =>
    • p 為空。
    • temp 是第一個列表元素。
    • 立即返回真。 第三次 check() 調用現在可以繼續。
  • 第三次調用 check()(續)=>
    • isPal 設置為 true (1 & 1 == 1)。
    • temp 設置為第二個列表元素。
    • 返回真。 第二次 check() 調用現在可以繼續。
  • 第二次調用 check()(續)=>
    • isPal 設置為 false (0 & 1 == 0)。
    • temp 設置為第三個列表元素。
    • 返回假。 第一次 check() 調用現在可以繼續。
  • 第一次調用 check()(續)=>
    • isPal 設置為 false (1 & 0 == 0)。
    • temp 設置為第三個列表元素。
    • 返回假。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM