剑指offer(11-15)
2020-09-18 本文已影响0人
yaco
JZ11
问题描述:
输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。
思路:
- 使用一个计数器32,遍历每个位置的元素
- 将当前数和1相与,如果当前的低位是1,那么相与的结果为1,如果当前低位是0,那么相与的结果为0;
- 然后使用一个res变量记录当前位置为1的个数
代码:
public class Solution {
public int NumberOf1(int n) {
int res = 0;
for(int i = 0; i < 32; i++) {
if((n & 1) == 1) {
res++;
}
n = n >> 1;
}
return res;
}
}
JZ12
问题描述:
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
保证base和exponent不同时为0
思路:
- 考虑正负号
- 当exponent为正数的时候,直接while循环相乘即可
- 当exponent为负数的时候,首先必须将exponent取正,然乎while求出累计和之后,求倒数即可
代码:
public class Solution {
public double Power(double base, int exponent) {
if(base == 0) return 0;
if(exponent == 0) return 1;
boolean f = exponent > 0 ? true : false;
exponent = Math.abs(exponent);
double res = 1;
while(exponent-- > 0) {
res *= base;
}
return f ? res : 1 / res;
}
}
JZ13
问题描述:
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
思路一:
- 创建一个辅助数组
- 第一次遍历原始数组的时候,将所有的奇数值加入数组
- 第二次遍历数组的时候,将所有的偶数值加入数组
- 第三次遍历将辅助数组中的所有元素全部放入原始数组中
思路二:
- 使用冒泡排序的思想(每次都是把最后面的偶数沉到数组底部)
- 每次遍历到奇数的时候跳过
- 当前位置是偶数且他下一个数也是偶数,跳过
- 当前位置是偶数且他下一个数是奇数,则交换当前的数和他下一个数
代码:
// 思路一:
public class Solution {
public void reOrderArray(int [] array) {
int n = array.length;
int[] t = new int[n];
int index = 0;
for(int i = 0; i < n; i++) {
if((array[i] & 1) == 1) {
t[index++] = array[i];
}
}
for(int i = 0; i < n; i++) {
if((array[i] & 1) == 0) {
t[index++] = array[i];
}
}
for(int i = 0; i < n; i++) {
array[i] = t[i];
}
}
}
// 思路二:
public class Solution {
public void reOrderArray(int [] array) {
int n = array.length;
for(int i = n - 1; i > 0; i--) {
for(int j = 0; j < i; j++) {
if((array[j] & 1) == 0 && ((array[j + 1] & 1) == 1)) {
swap(array, j, j + 1);
}
}
}
}
private void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
JZ14
问题描述:
输入一个链表,输出该链表中倒数第k个结点。
思路一:
- 首先让一个指针t先走k步
- 然后让r从head开始,和t指针同时向后走,如果t指针到null的时候,然后r指针即可
代码:
public class Solution {
public ListNode FindKthToTail(ListNode head,int k) {
ListNode t = head;
while(k-- > 0) {
if(t == null) return null;
t = t.next;
}
ListNode r = head;
while(t != null) {
r = r.next;
t = t.next;
}
return r;
}
}
JZ15
问题描述:
输入一个链表,反转链表后,输出新链表的表头。
思路一:
- 遍历的方式实现
代码:
public class Solution {
public ListNode ReverseList(ListNode head) {
if(head == null || head.next == null) return head;
ListNode pre = null, next = null;
while(head != null) {
next = head.next;
head.next = pre;
pre = head;
head = next;
}
return pre;
}
}