11.输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
思路:举个例子:一个二进制数1100,从右边数起第三位是处于最右边的一个1。减去1后,第三位变成0,它后面的两位0变成了1,而前面的1保持不变,因此得到的结果是1011.我们发现减1的结果是把最右边的一个1开始的所有位都取反了。这个时候如果我们再把原来的整数和减去1之后的结果做与运算,从原来整数最右边一个1那一位开始所有位都会变成0。如1100&1011=1000.也就是说,把一个整数减去1,再和原整数做与运算,会把该整数最右边一个1变成0.那么一个整数的二进制有多少个1,就可以进行多少次这样的操作。
class Solution:
def NumberOfl(self,n):
count = 0
if n<0:
n = n & 0xffffffff //负数补码
while n:
n = n & (n-1)
count += 1
return count
12.给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
class Solution:
def Power(self, base, exponent):
# write code here
return pow(base, exponent)
直接调用函数的方式太丑陋了,因此换C++代码实现。
/* 方法1,递归调用 */
class SOlution{
public:
double Power(int base, double exponent){
if(exponent>0)
{
if(exponent == 1)
return base;
if(exponent %2 == 0)
return Power(base, exponent/2)*Power(base, exponent/2);
else
return Power(base, exponent/2)*Power(base, exponent/2+1);
}
else if(exponent == 0)
{
return 1;
}
else
{return 1/Power(base, 0-exponent);}
}
}
/* 方法2 */
class Solution {
public:
double Power(double base, int exponent) {
long long p = abs((long long) exponent);
double r = 1.0;
while (p)
{
if(p & 1) //p与1作与运算非零
r *= base;
base *= base;
p >>= 1; //移位
}
return (exponent > 0)? r:1/r;
}
};
13.输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
思路:这其实是一个冒泡排序,将数组中的元素进行判断,若某个位置的数为奇数,且该数前一个元素为偶数,将互换。
class Solution:
def reOrderArray(self, array):
for i in range(len(array)):
for j in range(len(array-1),i,-1): //j从len(array-1)开始,逆序
if array[j]%2 == 1 and array[j-1]%2 == 0:
temp = array[j-1]
array[j-1] = array[j]
array[j] = temp
return array
/* 方法2:利用双向队列 */
from collections import deque
class Solution:
def reOrderArray(self, array):
# write code here
odd = deque()
x = len(array)
for i in range(x):
if array[i]%2 == 0:
odd.append(array[i])
if array[x-i-1]%2 == 1: //逆序,以保证顺序不变
odd.appendleft(array[x-i-1])
return list(odd)
14.输入一个链表,输出该链表中倒数第k个结点。
/* */
class Solution:
def Search(self, head, k)
l = []
while head != None:
l.append(head)
head = head.next
if len(l<k) or k<1:
return
return l[-k]
15.输入一个链表,反转链表后,输出新链表的表头。
思路:递归实现
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
# 返回ListNode
def ReverseList(self, pHead):
last = None
if not pHead or not pHead.next:
return pHead
while pHead:
temp = pHead.next //将pHead.next值赋给temp防止链表断裂
pHead.next = last
last = pHead
pHead = temp
return last