一、
public class Solution {
//如果末尾为1,则相与后刚好去掉了这个1
//如果末尾为0,减1后将最后一位1变成0,刚好也去掉了这个1
public int NumberOf1(int n) {
int res = 0;
while(n != 0) {
res++;
n &= n - 1;
}
return res;
}
}
二、
给定一个double类型的浮点数base和int类型的整数exponent。
求base的exponent次方。
public class Solution {
//快速幂,将exponent看做二进制
//负数只需要取倒数就行了
public double Power(double base, int exponent) {
double res = 1;
int tmpExp = Math.abs(exponent);
while(tmpExp > 0) {
if(tmpExp % 2 == 1) {
res *= base;
}
base *= base;
tmpExp >>= 1;
}
return exponent>0 ? res : 1/res;
}
}
三、
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,
使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,
并保证奇数和奇数,偶数和偶数之间的相对位置不变。
public class Solution {
//插入排序是稳定排序,可以直接用插入排序的思想
public void reOrderArray(int [] array) {
if(array == null || array.length == 0) {
return;
}
int pos = 0;//记录连续奇数的最后一个位置
for(int i = 0; i < array.length; i++) {
if(array[i] % 2 == 0) {
//找到后面的第一个奇数
int odd = i;
while(odd < array.length && array[odd] % 2 == 0) {
odd++;
}
//插入到pos位置
if(odd < array.length) {
int tmp = array[odd];
while(odd != pos) {
array[odd] = array[odd - 1];
odd--;
}
array[pos] = tmp;
}else {
break;
}
}
pos++;
}
}
}
四、
输入一个链表,输出该链表中倒数第k个结点。
public class Solution {
//倒数第k个,实际就是正数第n-k+1个
public ListNode FindKthToTail(ListNode head,int k) {
//先记录链表长
int len = listLen(head);
if(k > len) {
return null;
}
int cnt = 0;
while(cnt < len-k) {
head = head.next;
cnt++;
}
return head;
}
public int listLen(ListNode head) {
int len = 0;
while(head != null) {
len++;
head = head.next;
}
return len;
}
}