当前位置: 首页 > 知识库问答 >
问题:

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

归浩博
2023-03-14

说明:

我手头有问题陈述,我在leedcode讨论部分遇到了一个有趣的2行C解决方案。我试图分解它以理解它的意思,除了一行小行,我理解了其余的。我的问题在最后。

Leetcode问题陈述:

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

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

说明:缺少的正整数是[1,5,6,8,9,10,12,13,…]。第五个失踪

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

说明:缺少的正整数是[5,6,7,…]。第二个缺失的正整数是6。

约束条件:

  1. 1

双衬里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=计数器-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;    
}

共有1个答案

慕容坚
2023-03-14

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

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

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

因此,计数器-1实际上被分配给k,但其求值(k本身)被丢弃,因此使用0。为什么是0?因为它是逻辑或运算符的中性操作数。事实上

X || 0 ==> X

换句话说,我们有一个表达式

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

即被评估为

stuff_at_the_left || 0

因为0是逻辑or中的中性操作数,所以最后的求值是左边的stuff\u。

这个奇怪的表达式的目的是为了作弊:作者在某个时候需要将该值赋给k,但不需要添加更多的行来“破坏”一行。因此,他们在逻辑表达式中包含赋值,使其与逗号运算符和or运算符的中性操作数相结合,成为中性操作数
我们还必须指出,只有当左
处的所有stuff\u被评估为0时(由于C中逻辑运算符的短路性质),才执行赋值。生成的扩展代码

if (!stuff_at_the_left)
    k= counter-1;

注意:在C中,逗号运算符的优先级是所有运算符中最低的,这就是为什么首先执行赋值。

 类似资料:
  • C++ 运算符 使用逗号运算符的为了把几个表达式串在一起。整个逗号表达式的值是以逗号分隔的列表中的最后一个表达式的值。从本质上讲,逗号的作用是导致一系列运算被顺序执行。 最右边的那个表达式的值将作为整个逗号表达式的值,其他表达式的值会被丢弃。例如: var = (count=19, incr=10, count+1); 在这里,首先把 count 赋值为 19,把 incr 赋值为 10,然后

  • 我正在阅读关于运算符优先级和运算符关联性的mdn文档“运算符优先级和运算符关联性(MDN)”,并希望通过阅读ECMAScript规范了解更多信息。 但我没有发现任何关于运算符优先级和运算符关联性的内容。 有人能给我一个ECMAScript规范的链接吗,在那里他们描述了每个运算符的优先级和关联性。 非常感谢您的帮助。我需要知道ECMAScript规范是否没有提到 每个运算符的优先级和关联性语言实现者

  • 问题内容: 我知道我可以这样使用逗号运算符 但是有些文章似乎建议可以在for循环声明之外使用逗号运算符,例如 来源:http : //www.cs.umd.edu/~clin/MoreJava/ControlFlow/comma.html 要么 来源:http://codingdict.com/questions/144878 对于代码混淆竞赛或使我的同事困惑,这将是一个绝妙的技巧,但是两个示例都

  • 有符号和无符号变量在按位运算上有区别吗?< br >例如,在处理无符号数字时:< br> 将得到00000101。 但当处理带符号的数字时会发生什么?

  • 逗号运算符的目的是将几个表达式串起来。 以逗号分隔的表达式列表的值是最右侧表达式的值。 本质上,逗号的效果是导致执行一系列操作。 其他表达式的值将被丢弃。 这意味着右侧的表达式将成为整个逗号分隔表达式的值。 例如 - var = (count = 19, incr = 10, count+1); 这里首先指定计数值19,指定incr值10,然后将count加1,最后指定var最右边表达式的值,c

  • 本文向大家介绍C语言位运算和sizeof运算符详解,包括了C语言位运算和sizeof运算符详解的使用技巧和注意事项,需要的朋友参考一下 位运算和sizeof运算符       C语言中提供了一些运算符可以直接操作整数的位,称为位运算,因此位运算中的操作数都必须是整型的。位运算的效率是比较高的,而且位运算运用好的话会达到意想不到的效果。位运算主要有6种:与(&),或(|),取反(~),异或(^),左