发现一个有意思的小程序检查二进制中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)的额外空间。
具体代码和测试见:实现