題目十一:二進(jìn)制中1的個數(shù)
題目描述:
輸入一個整數(shù),輸出該數(shù)二進(jìn)制表示中1的個數(shù)。其中負(fù)數(shù)用補(bǔ)碼表示。
解題思路:
如果一個整數(shù)不為0掀潮,那么這個整數(shù)至少有一位是1。如果我們把這個整數(shù)減1琼富,那么原來處在整數(shù)最右邊的1就會變?yōu)?仪吧,原來在1后面的所有的0都會變成1(如果最右邊的1后面還有0的話)。其余所有位將不會受到影響
舉個例子:一個二進(jìn)制數(shù)1100鞠眉,從右邊數(shù)起第三位是處于最右邊的一個1薯鼠。減去1后,第三位變成0械蹋,它后面的兩位0變成了1出皇,而前面的1保持不變,因此得到的結(jié)果是1011.我們發(fā)現(xiàn)減1的結(jié)果是把最右邊的一個1開始的所有位都取反了朝蜘。這個時候如果我們再把原來的整數(shù)和減去1之后的結(jié)果做與運(yùn)算,從原來整數(shù)最右邊一個1那一位開始所有位都會變成0涩金。如1100&1011=1000.也就是說谱醇,把一個整數(shù)減去1暇仲,再和原整數(shù)做與運(yùn)算,會把該整數(shù)最右邊一個1變成0.那么一個整數(shù)的二進(jìn)制有多少個1副渴,就可以進(jìn)行多少次這樣的操作奈附。
public int NumberOf1(int n) {
int count = 0;
while(n!= 0){
count++;
n = n & (n - 1);
}
return count;
}
題目十二:數(shù)值的整數(shù)次方
題目描述:
給定一個double類型的浮點(diǎn)數(shù)base和int類型的整數(shù)exponent。求base的exponent次方煮剧。
解題思路:
使用for循環(huán)相乘及得出結(jié)果斥滤,判斷最終是正數(shù)次方還是負(fù)數(shù)次方。
public double Power(double base, int exponent) {
double result = 1;
for(int i = 0; i < Math.abs(exponent); i++){
result *= base;
}
if(exponent < 0){
result = 1 / result;
}
return result;
}
題目十三:調(diào)整數(shù)組順序使奇數(shù)位于偶數(shù)前面
題目描述:
輸入一個整數(shù)數(shù)組勉盅,實(shí)現(xiàn)一個函數(shù)來調(diào)整該數(shù)組中數(shù)字的順序佑颇,使得所有的奇數(shù)位于數(shù)組的前半部分,所有的偶數(shù)位于位于數(shù)組的后半部分草娜,并保證奇數(shù)和奇數(shù)挑胸,偶數(shù)和偶數(shù)之間的相對位置不變。
解題思路:
類似插入排序算法宰闰,創(chuàng)建一個奇數(shù)個數(shù)指針茬贵,循環(huán)整個數(shù)組,遇到奇數(shù)就移到奇數(shù)個數(shù)指針的位置移袍,然后中間移動位數(shù)的數(shù)組向右移(順次移動)解藻。
public void reOrderArray(int [] array) {
int current = 0;
for(int i = 0; i < array.length; i++){
if(array[i] % 2 == 1){
//奇數(shù)
int a = array[i];
for(int j = i; j > current; j--){
array[j] = array[j - 1];
}
array[current] = a;
current++;
}
}
}
題目十四:鏈表中倒數(shù)第k個結(jié)點(diǎn)
題目描述:
輸入一個鏈表,輸出該鏈表中倒數(shù)第k個結(jié)點(diǎn)葡盗。
解題思路:
要輸出的這個節(jié)點(diǎn)的正數(shù)值 = 總數(shù) - K螟左;
public ListNode FindKthToTail(ListNode head, int k) {
if(head==null||k<=0){
return null;
}
//兩個指針都指向頭結(jié)點(diǎn)
ListNode pre = head;
ListNode p = head;
//記錄k值
int a = k;
//記錄節(jié)點(diǎn)的個數(shù)
int count = 0;
//p指針先跑,并且記錄節(jié)點(diǎn)數(shù)戳粒,當(dāng)p指針跑了k-1個節(jié)點(diǎn)后路狮,pre指針開始跑,
//當(dāng)p指針跑到最后時蔚约,pre所指指針就是倒數(shù)第k個節(jié)點(diǎn)
while (p != null){
p = p.next;
count++;
if(k < 1){
pre = pre.next;
}
k--;
}
//如果節(jié)點(diǎn)個數(shù)小于所求的倒數(shù)第k個節(jié)點(diǎn)奄妨,則返回空
if(count < a){
return null;
}
return pre;
}
題目十五:反轉(zhuǎn)鏈表
題目描述:
輸入一個鏈表,反轉(zhuǎn)鏈表后苹祟,輸出鏈表的所有元素砸抛。
解題思路:
next = head.next;//首先記錄當(dāng)前節(jié)點(diǎn)的下一個節(jié)點(diǎn),(保存起來)
head.next = pre;//讓當(dāng)前節(jié)點(diǎn)指向前一個節(jié)點(diǎn)树枫,因為要反序嘛
pre = head;//讓前一個節(jié)點(diǎn)值直焙,取代當(dāng)前的節(jié)點(diǎn)值。因為要繼續(xù)向下走
head = next;//讓下一個節(jié)點(diǎn)砂轻,取代當(dāng)前節(jié)點(diǎn)奔誓。同樣是向下走,為下一次循環(huán)做準(zhǔn)備
public ListNode ReverseList(ListNode head) {
ListNode pre = null;
ListNode next = null;
while (head != null){
next = head.next;
head.next = pre;
pre = head;
head = next;
}
return pre;
}