arrays - 在 for 循环中找到了 2 个带有 ',' 运算符的线性 C 解决方案,有人可以解释给定的逗号运算符语句吗?

标签 arrays c for-loop

说明:

我已经关注了手头的问题陈述,我在 leedcode 讨论部分遇到了一个有趣的 2 行 C 解决方案。我试着分解它来理解它的意思,除了一小行,其余的我都明白了。我的问题在最后。

Leetcode问题陈述:

给定一个按严格递增顺序排序的正整数数组 arr 和一个整数 k。 找出该数组中缺少的第 k 个正整数。

示例 1:输入:arr = [2,3,4,7,11], k = 5 输出:9

Explanation: The missing positive integers are [1,5,6,8,9,10,12,13,...]. The 5th missing >>positive integer is 9.

示例 2: 输入:arr = [1,2,3,4],k = 2 输出:6

Explanation: The missing positive integers are [5,6,7,...]. The 2nd missing positive integer is 6.

约束:

  1. 1 <= arr.length <= 1000
  2. 1 <= arr[i] <= 1000
  3. 1 <= k <= 1000
  4. arr[i] < arr[j]对于 1 <= i < j <= arr.length

双衬管C解决方案:

    int findKthPositive(int* arr, int arrSize, int k){
        for (int arrCurrIndex = 0, counter = 1 ; (k && (arrCurrIndex < arrSize) ? ((arr[arrCurrIndex] != counter) ? k-- : ++arrCurrIndex) : k--) || (k = counter-1, 0) ; counter++);
        return k;
    } 

供引用:以下是正在部署的类似算法,但它更容易理解。


    int findKthPositive(int* arr, int arrSize, int k){ 
        for (int counter=1, arrCurrIndex=0; counter<10000; counter++) { 
            // exceed arr limits 
            if (arrCurrIndex < arrSize) { 
                if (counter == arr[arrCurrIndex]) { // found element in array 
                    index++; 
                    continue; 
                } 
            } 
            // missing element 
            k--; 
            if (k==0) { 
                return counter; 
            } 
        } 
        return 0; 
    } 

我的问题:

解决方案 #1 中的以下行到底意味着什么?

(k = counter-1, 0)

======更新答案=======

我稍微修改了有问题的解决方案#1,以使其更具可读性。它强调了有关给定陈述的情况。 这是修改后的解决方案:

int findKthPositive(int* arr, int arrSize, int k){
    // move counter out of the foor loop
    int counter=1;
    for (int arrCurrIndex = 0; 
    (k && (arrCurrIndex < arrSize) ? 
    ((arr[arrCurrIndex] != counter) ? k-- : ++arrCurrIndex) 
    : k--); counter++);
    return counter-1;    
}

最佳答案

二元逗号运算符,计算第一个操作数,丢弃结果,然后计算第二个操作数。

在您发布的表达式中,我们有

... || (k = counter-1, 0) ; 

所以counter-1实际上分配给k但它的评估( k 本身)被丢弃,因此 0用来。 为什么是 0?因为它是逻辑或运算符的中性操作数|| 。事实上

X || 0 ==> X

换句话说,我们有表达式

stuff_at_the_left || (k = counter-1, 0 )

评估为

stuff_at_the_left || 0

由于 0 是逻辑 or 中的中性操作数,因此最终的计算结果为 stuff_at_the_left .

这个奇怪的表达式的目的是作弊:作者在某些时候需要将该值分配给 k但没有添加更多的线条来“破坏”一个衬里。因此,他们将赋值包含在逻辑表达式中,使其与逗号运算符结合或运算符的中性操作数成为中性。
我们还必须说,赋值k=counter-1, 0仅当全部 stuff_at_the_left 时才执行计算结果为 0(由于 C 中逻辑运算符的短路性质)。生成的扩展代码为

if (!stuff_at_the_left)
    k= counter-1;

注意:在 C 语言中,逗号运算符的优先级最低,因此首先执行赋值操作。

关于arrays - 在 for 循环中找到了 2 个带有 ',' 运算符的线性 C 解决方案,有人可以解释给定的逗号运算符语句吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64900655/

相关文章:

php - 根据列值合并两个对象数组之间的行

php - 如何创建键名与分配给数组的 $ 变量名相同的数组?

java - 如何将 Java SQL 查询转换为 Java 对象 [][]?

java - 从 'stream()' 或 'parallelStream()' 中捕获异常会丢失正确的值

python - 循环计数器表现异常

C++ 返回结构数组

c - 为什么这会导致核心转储?

c - 在不中止核心的情况下释放 C 中的内存

c++ - 阵列平均

javascript - 如何清除动态生成的表中的行?