说明:
我已经关注了手头的问题陈述,我在 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 <= arr.length <= 1000
- 1 <= arr[i] <= 1000
- 1 <= k <= 1000
-
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/