JZ11
問題描述:
輸入一個整數(shù),輸出該數(shù)32位二進(jìn)制表示中1的個數(shù)音榜。其中負(fù)數(shù)用補(bǔ)碼表示庞瘸。
思路:
- 使用一個計數(shù)器32,遍歷每個位置的元素
- 將當(dāng)前數(shù)和1相與赠叼,如果當(dāng)前的低位是1擦囊,那么相與的結(jié)果為1违霞,如果當(dāng)前低位是0,那么相與的結(jié)果為0瞬场;
- 然后使用一個res變量記錄當(dāng)前位置為1的個數(shù)
代碼:
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類型的浮點(diǎn)數(shù)base和int類型的整數(shù)exponent买鸽。求base的exponent次方。
保證base和exponent不同時為0
思路:
- 考慮正負(fù)號
- 當(dāng)exponent為正數(shù)的時候泌类,直接while循環(huán)相乘即可
- 當(dāng)exponent為負(fù)數(shù)的時候癞谒,首先必須將exponent取正,然乎while求出累計和之后刃榨,求倒數(shù)即可
代碼:
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
問題描述:
輸入一個整數(shù)數(shù)組弹砚,實現(xiàn)一個函數(shù)來調(diào)整該數(shù)組中數(shù)字的順序,使得所有的奇數(shù)位于數(shù)組的前半部分枢希,所有的偶數(shù)位于數(shù)組的后半部分桌吃,并保證奇數(shù)和奇數(shù),偶數(shù)和偶數(shù)之間的相對位置不變苞轿。
思路一:
- 創(chuàng)建一個輔助數(shù)組
- 第一次遍歷原始數(shù)組的時候茅诱,將所有的奇數(shù)值加入數(shù)組
- 第二次遍歷數(shù)組的時候,將所有的偶數(shù)值加入數(shù)組
- 第三次遍歷將輔助數(shù)組中的所有元素全部放入原始數(shù)組中
思路二:
- 使用冒泡排序的思想(每次都是把最后面的偶數(shù)沉到數(shù)組底部)
- 每次遍歷到奇數(shù)的時候跳過
- 當(dāng)前位置是偶數(shù)且他下一個數(shù)也是偶數(shù)搬卒,跳過
- 當(dāng)前位置是偶數(shù)且他下一個數(shù)是奇數(shù)瑟俭,則交換當(dāng)前的數(shù)和他下一個數(shù)
代碼:
// 思路一:
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
問題描述:
輸入一個鏈表,輸出該鏈表中倒數(shù)第k個結(jié)點(diǎn)契邀。
思路一:
- 首先讓一個指針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
問題描述:
輸入一個鏈表缀棍,反轉(zhuǎn)鏈表后茎匠,輸出新鏈表的表頭咙鞍。
思路一:
- 遍歷的方式實現(xiàn)
代碼:
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;
}
}