劍指Offer(三)

題目十一:二進(jìn)制中1的個(gè)數(shù)

題目描述:
輸入一個(gè)整數(shù),輸出該數(shù)二進(jìn)制表示中1的個(gè)數(shù)。其中負(fù)數(shù)用補(bǔ)碼表示。

解題思路:
如果一個(gè)整數(shù)不為0,那么這個(gè)整數(shù)至少有一位是1。如果我們把這個(gè)整數(shù)減1,那么原來(lái)處在整數(shù)最右邊的1就會(huì)變?yōu)?,原來(lái)在1后面的所有的0都會(huì)變成1(如果最右邊的1后面還有0的話)。其余所有位將不會(huì)受到影響
舉個(gè)例子:一個(gè)二進(jìn)制數(shù)1100,從右邊數(shù)起第三位是處于最右邊的一個(gè)1。減去1后,第三位變成0,它后面的兩位0變成了1,而前面的1保持不變,因此得到的結(jié)果是1011.我們發(fā)現(xiàn)減1的結(jié)果是把最右邊的一個(gè)1開(kāi)始的所有位都取反了。這個(gè)時(shí)候如果我們?cè)侔言瓉?lái)的整數(shù)和減去1之后的結(jié)果做與運(yùn)算,從原來(lái)整數(shù)最右邊一個(gè)1那一位開(kāi)始所有位都會(huì)變成0。如1100&1011=1000.也就是說(shuō),把一個(gè)整數(shù)減去1,再和原整數(shù)做與運(yùn)算,會(huì)把該整數(shù)最右邊一個(gè)1變成0.那么一個(gè)整數(shù)的二進(jìn)制有多少個(gè)1,就可以進(jìn)行多少次這樣的操作。

    public int NumberOf1(int n) {
        int count = 0;
        while(n!= 0){
            count++;
            n = n & (n - 1);
         }
        return count;
    }

題目十二:數(shù)值的整數(shù)次方

題目描述:
給定一個(gè)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ù)前面

題目描述:
輸入一個(gè)整數(shù)數(shù)組,實(shí)現(xiàn)一個(gè)函數(shù)來(lái)調(diào)整該數(shù)組中數(shù)字的順序,使得所有的奇數(shù)位于數(shù)組的前半部分,所有的偶數(shù)位于位于數(shù)組的后半部分,并保證奇數(shù)和奇數(shù),偶數(shù)和偶數(shù)之間的相對(duì)位置不變。

解題思路:
類似插入排序算法,創(chuàng)建一個(gè)奇數(shù)個(gè)數(shù)指針,循環(huán)整個(gè)數(shù)組,遇到奇數(shù)就移到奇數(shù)個(gè)數(shù)指針的位置,然后中間移動(dòng)位數(shù)的數(shù)組向右移(順次移動(dòng))。


    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個(gè)結(jié)點(diǎn)

題目描述:
輸入一個(gè)鏈表,輸出該鏈表中倒數(shù)第k個(gè)結(jié)點(diǎn)。

解題思路:
要輸出的這個(gè)節(jié)點(diǎn)的正數(shù)值 = 總數(shù) - K;

    public ListNode FindKthToTail(ListNode head, int k) {

        if(head==null||k<=0){
            return null;
        }
        //兩個(gè)指針都指向頭結(jié)點(diǎn)
        ListNode pre = head;
        ListNode p = head;

        //記錄k值
        int a = k;
        //記錄節(jié)點(diǎn)的個(gè)數(shù)
        int count = 0;

        //p指針先跑,并且記錄節(jié)點(diǎn)數(shù),當(dāng)p指針跑了k-1個(gè)節(jié)點(diǎn)后,pre指針開(kāi)始跑,
        //當(dāng)p指針跑到最后時(shí),pre所指指針就是倒數(shù)第k個(gè)節(jié)點(diǎn)
        while (p != null){
            p = p.next;
            count++;
            if(k < 1){
                pre = pre.next;
            }
            k--;
        }

        //如果節(jié)點(diǎn)個(gè)數(shù)小于所求的倒數(shù)第k個(gè)節(jié)點(diǎn),則返回空
        if(count < a){
            return null;
        }
        return pre;
    }

題目十五:反轉(zhuǎn)鏈表

題目描述:
輸入一個(gè)鏈表,反轉(zhuǎn)鏈表后,輸出鏈表的所有元素。

解題思路:
next = head.next;//首先記錄當(dāng)前節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn),(保存起來(lái))
head.next = pre;//讓當(dāng)前節(jié)點(diǎn)指向前一個(gè)節(jié)點(diǎn),因?yàn)橐葱蚵?br> pre = head;//讓前一個(gè)節(jié)點(diǎn)值,取代當(dāng)前的節(jié)點(diǎn)值。因?yàn)橐^續(xù)向下走
head = next;//讓下一個(gè)節(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;
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 劍指Offer筆試題(1) 題目來(lái)源:??途W(wǎng) 題目一 調(diào)整數(shù)組序列使奇數(shù)位于偶數(shù)序列前 描述: 輸入一個(gè)整數(shù)數(shù)組...
    Torang閱讀 1,508評(píng)論 0 6
  • 說(shuō)明: 本文中出現(xiàn)的所有算法題皆來(lái)自??途W(wǎng)-劍指Offer在線編程題,在此只是作為轉(zhuǎn)載和記錄,用于本人學(xué)習(xí)使用,不...
    秋意思寒閱讀 1,216評(píng)論 1 1
  • 注意:本文適用于已刷過(guò)題目,想短短幾分鐘快速簡(jiǎn)單回顧的情況。沒(méi)看過(guò)《劍指offer》的讀者建議先閱讀下。 斐波那契...
    FeelsChaotic閱讀 1,896評(píng)論 2 8
  • 劍指offer 最近在牛客網(wǎng)上刷劍指offer的題目,現(xiàn)將題目和答案(均測(cè)試通過(guò))總結(jié)如下: 二維數(shù)組的查找 替換...
    閆阿佳閱讀 1,056評(píng)論 0 10
  • 劍指 offer 在一個(gè)二維數(shù)組中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請(qǐng)完成...
    faremax閱讀 2,323評(píng)論 0 7

友情鏈接更多精彩內(nèi)容