两个小题目

发现一个有意思的小程序检查二进制中1的个数


int func(int x)
{
int countx=0;
while(x)
{
    countx++;
    x=x&(x-1);
}
return countx;
}

一开始想着用双指针,但是没思路,后面查了一下双指针的思路

准做法是使用两个指针,一个每次往前走2步,一个每次往前走1步,如果两个指针相遇,即说明链表有环,时间复杂度为O(N),空间复杂度为O(1)。

还有一种做法就是

对这个链表求逆,求逆的结果链表上每一个指针都反向,如果逆序完之后,链表的头节点不变,即说明链接有环。具体的证明过程略。这个方法的复杂也是O(N),但是需要修改原链表,或者使用O(N)的额外空间。

具体代码和测试见:实现

你可能感兴趣的:(笔试和面试)