【问题标题】:Error when changing the order of A and B in (A&B) AND operator在 (A&B) AND 运算符中更改 A 和 B 的顺序时出错
【发布时间】:2020-08-30 13:29:28
【问题描述】:

下面是查找 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;
    }
};

【问题讨论】:

  • && 是 and 运算符

标签: linked-list bit-manipulation and-operator


【解决方案1】:

解决方案

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) 被计算为 true,因为它们是相同的元素。然后调用 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 为 NULL。
    • temp 是第一个列表元素。
    • 立即返回真。现在可以继续第三次 check() 调用。
  • 第三次调用 check()(续)=>
    • isPal 设置为 true (1 & 1 == 1)。
    • 临时设置为第二个列表元素。
    • 返回真。现在可以继续第二次 check() 调用。
  • 第二次调用 check()(续)=>
    • isPal 设置为 false (0 & 1 == 0)。
    • 临时设置为第三个列表元素。
    • 返回假。现在可以继续第一次 check() 调用。
  • 第一次调用 check()(续)=>
    • isPal 设置为 false (1 & 0 == 0)。
    • 临时设置为第三个列表元素。
    • 返回 false。

【讨论】:

    猜你喜欢
    • 2021-11-28
    • 1970-01-01
    • 2011-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-14
    • 1970-01-01
    相关资源
    最近更新 更多