国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁(yè) Java Java面試題 java面試中常見的數(shù)組題目匯總(二)

java面試中常見的數(shù)組題目匯總(二)

Nov 09, 2020 pm 03:27 PM
java 數(shù)組 面試

java面試中常見的數(shù)組題目匯總(二)

1、斐波那契數(shù)列

【題目】

大家都知道斐波那契數(shù)列,現(xiàn)在要求輸入一個(gè)整數(shù) n,請(qǐng)你輸出斐波那契數(shù)列的第 n 項(xiàng)(從 0 開始,第 0 項(xiàng)為 0)。

(視頻教程推薦:java課程

【代碼】

package swear2offer.array;


public class FeiBoNaQi {

    /**
     * 大家都知道斐波那契數(shù)列,現(xiàn)在要求輸入一個(gè)整數(shù) n,
     * 請(qǐng)你輸出斐波那契數(shù)列的第 n 項(xiàng)(從 0 開始,第 0 項(xiàng)為 0)。
     * 0,1,1,2,3,5
     * n<=39
     * */
    public int Fibonacci(int n) {
        if (n == 0) return 0;

        if (n == 1 || n== 2) return 1;

        return Fibonacci(n-1) + Fibonacci(n-2);
    }

    /**
     * 非遞歸方式,遞歸的數(shù)據(jù)結(jié)構(gòu)使用的棧,那就是使用棧的方式
     * */
    public int NoRecursive(int n) {
        if (n>2) {
            int[] a = new int[n+1];
            a[0] = 0;
            a[1] = 1;
            a[2] = 1;

            for (int i=3; i<=n; i++) {
                a[i] = a[i-1] + a[i-2];
            }

            return a[n];
        } else {
            if (n == 0) return 0;
            else return 1;
        }
    }

    public static void main(String[] args) {
        System.out.println(new FeiBoNaQi().Fibonacci(39));
        System.out.println(new FeiBoNaQi().Fibonacci(39));
    }
}

2、矩形覆蓋

【題目】

我們可以用 21 的小矩形橫著或者豎著去覆蓋更大的矩形。請(qǐng)問(wèn)用 n 個(gè) 21 的小矩形無(wú)重疊地覆蓋一個(gè) 2*n 的大矩形,總共有多少種方法?

比如 n=3 時(shí),2*3 的矩形塊有 3 種覆蓋方法:

12711bde10f197c3e9af47c34b0cc46.png

代碼:

package swear2offer.array;

public class Rectangle {

    /**
     * f[0] = 0;
     * f[1] = 1;
     * f[2] = 2;
     * f[3] = 3;
     * f[4] = 5;
     * f[5] = 8;
     * f[n] = f[n-1] + f[n-2]
     * */

    public int RectCover(int target) {

        if (target < 4) return target;

        int[] f = new int[target + 1];
        int i;
        for (i=0; i<4; i++) f[i] = i;

        for (i=4; i<=target; i++) {
            f[i] = f[i-1] + f[i-2];
        }

        return f[target];
    }



    public static void main(String[] args) {
        System.out.println(new Rectangle().RectCover(5));
    }
}

【思考】

最直白的結(jié)題方式就是找規(guī)律,從總結(jié)的規(guī)律可以看出這是斐波那契數(shù)列的實(shí)現(xiàn)方式;另一種就是根據(jù)題意來(lái)解答,求n的方法,這類問(wèn)題很容易想到是從n-1來(lái)求解,而第一個(gè)塊是橫(f[n-2])是豎(f[n-1]),分別對(duì)應(yīng)不同的情況

(更多相關(guān)面試題推薦:java面試題及答案

3、二進(jìn)制中 1 的個(gè)數(shù)

【題目】

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

【代碼】

package swear2offer.array;

public class Binary {

    /**
     * 輸入一個(gè)整數(shù),輸出該數(shù)二進(jìn)制表示中 1 的個(gè)數(shù)。其中負(fù)數(shù)用補(bǔ)碼表示。
     * */
    public int NumberOf1(int n) {
        int count;
        count = 0;

        while(n != 0) {
            n = n & (n-1);// 與操作就是二進(jìn)制的操作,適用原碼和補(bǔ)碼
            count ++;
        }

        return count;
    }
}

【思考】

負(fù)數(shù)的反碼: 符號(hào)位不變,其余各位按位取反負(fù)數(shù)的補(bǔ)碼:在其反碼的基礎(chǔ)上+1

如果一個(gè)整數(shù)不為 0,那么這個(gè)整數(shù)至少有一位是 1。如果我們把這個(gè)整數(shù)減 1,那么原來(lái)處在整數(shù)最右邊的 1 就會(huì)變?yōu)?0,原來(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 開始的所有位都取反了。這個(gè)時(shí)候如果我們?cè)侔言瓉?lái)的整數(shù)和減去 1 之后的結(jié)果做與運(yùn)算,從原來(lái)整數(shù)最右邊一個(gè) 1 那一位開始所有位都會(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)行多少次這樣的操作。

4、數(shù)值的整數(shù)次方

【題目】

給定一個(gè) double 類型的浮點(diǎn)數(shù) base 和 int 類型的整數(shù) exponent。求 base 的 exponent 次方。
保證 base 和 exponent 不同時(shí)為 0

【代碼】

package swear2offer.array;

public class Power {

    public double Power(double base, int exponent) {

        if (base == 0) return 0;
        if (exponent == 0) return 1;

        int count;
        boolean flag;
        double temp;

        count = 1;
        temp = base;
        flag = true;// 標(biāo)記正負(fù)

        if (exponent < 0){
            exponent = -exponent;
            flag = false;
        }

        while (count < exponent) {
            base *= temp;
            count ++;
        }

        if (flag) {
            return base;
        } else {
            return 1/base;
        }

    }

    public static void main(String[] args) {
        System.out.println(new Power().Power(2,-3));
    }

}

【思考】

本題難度并不大,算法也不是很復(fù)雜,但是邊邊角角很容易遺漏,

第一點(diǎn)就是exponent的正負(fù),很容易就漏掉負(fù)數(shù)的情況

其次,base==0和exponent==0的情況是不一樣的

最后,base累乘的時(shí)候,是不能用本身的,因?yàn)閎ase是不斷變大的。

5、調(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ì)位置不變。

【代碼】

package swear2offer.array;

import java.util.Arrays;

public class OddEven {

    /**
     * 輸入一個(gè)整數(shù)數(shù)組,實(shí)現(xiàn)一個(gè)函數(shù)來(lái)調(diào)整該數(shù)組中數(shù)字的順序,
     * 使得所有的奇數(shù)位于數(shù)組的前半部分,所有的偶數(shù)位于數(shù)組的后半部分,
     * 并保證奇數(shù)和奇數(shù),偶數(shù)和偶數(shù)之間的相對(duì)位置不變。
     *
     * 時(shí)空復(fù)雜度較高的算法:
     * 新建一個(gè)數(shù)組b,用來(lái)保存奇數(shù),在重新變量一次,保存偶數(shù)
     * 時(shí)空復(fù)雜度0(n)
     * */
    public void reOrderArray1(int [] array) {
        int n,i,j;
        n = array.length;

        int[] b = new int[n];

        j = 0;// 用來(lái)保存數(shù)組B的下標(biāo)
        for (i=0; i<n; i++) {
            if (array[i]%2 != 0) {
                b[j] = array[i];
                j ++;
            }
        }
        for (i=0; i<n; i++) {
            if (array[i]%2 == 0){
                b[j] = array[i];
                j++;
            }
        }

        for (i=0; i<n; i++) {
            array[i] = b[i];
        }
    }

    /**
     * 采用的冒泡交換以及快速排序的思想:
     * 設(shè)定兩個(gè)游標(biāo),游標(biāo)分別用來(lái)標(biāo)記奇數(shù)和偶數(shù)的下標(biāo),然后交換二者
     * 注意交換二者是無(wú)法保證順序的,交換的ij之間還有進(jìn)行平移。
     * */
    public void reOrderArray(int [] array) {

        int n,i,j,temp,p;

        n = array.length;
        i = 0;
        j = 0;
        while (i<n && j<n) {
            // i標(biāo)記偶數(shù)下標(biāo)
            while (i<n) {
                if (array[i]%2 ==0){
                    break;
                } else {
                    i++;
                }
            }
            j = i;
            // j標(biāo)記奇數(shù)下標(biāo)
            while (j<n) {
                if (array[j]%2 !=0){
                    break;
                } else {
                    j++;
                }
            }
            if (i<n && j<n) {
                // 此時(shí)ij已經(jīng)在遇到的第一個(gè)偶數(shù)和奇數(shù)停下,把ij之間的內(nèi)容平移
                temp = array[j];
                for (p=j; p>i; p--) {
                    array[p] = array[p-1];
                }
                array[i] = temp;
                // 此時(shí)把i,j標(biāo)記到 未交換前的偶數(shù)位置的下一個(gè)
                i ++;
                j = i;
            }
        }
    }

    public static void main(String[] args) {
        int[] a = {1,4,6,3,2,5,8};
        int[] b = {2,4,6,1,3,5,7};
        new OddEven().reOrderArray(b);
        System.out.println(Arrays.toString(b));
    }
}

【思考】

顯然,創(chuàng)建新數(shù)組的方式,是一種取巧的方式,題目要求是需要在本數(shù)組上進(jìn)行操作,第二種方式就是采用在本數(shù)組上進(jìn)行操作的,而這種雙游標(biāo)遞進(jìn)的方式跟快速排序的思想很接近。

相關(guān)推薦:java入門

以上是java面試中常見的數(shù)組題目匯總(二)的詳細(xì)內(nèi)容。更多信息請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻(xiàn),版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請(qǐng)聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動(dòng)的應(yīng)用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機(jī)

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強(qiáng)大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁(yè)開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)代碼編輯軟件(SublimeText3)

如何在Java的地圖上迭代? 如何在Java的地圖上迭代? Jul 13, 2025 am 02:54 AM

遍歷Java中的Map有三種常用方法:1.使用entrySet同時(shí)獲取鍵和值,適用于大多數(shù)場(chǎng)景;2.使用keySet或values分別遍歷鍵或值;3.使用Java8的forEach簡(jiǎn)化代碼結(jié)構(gòu)。entrySet返回包含所有鍵值對(duì)的Set集合,每次循環(huán)獲取Map.Entry對(duì)象,適合頻繁訪問(wèn)鍵和值的情況;若只需鍵或值,可分別調(diào)用keySet()或values(),也可在遍歷鍵時(shí)通過(guò)map.get(key)獲取值;Java8中可通過(guò)Lambda表達(dá)式使用forEach((key,value)-&gt

Java可選示例 Java可選示例 Jul 12, 2025 am 02:55 AM

Optional能清晰表達(dá)意圖并減少null判斷的代碼噪音。1.Optional.ofNullable是處理可能為null對(duì)象的常用方式,如從map中取值時(shí)可結(jié)合orElse提供默認(rèn)值,邏輯更清晰簡(jiǎn)潔;2.通過(guò)鏈?zhǔn)秸{(diào)用map實(shí)現(xiàn)嵌套取值,安全地避免NPE,任一環(huán)節(jié)為null則自動(dòng)終止并返回默認(rèn)值;3.filter可用于條件篩選,滿足條件才繼續(xù)執(zhí)行后續(xù)操作,否則直接跳到orElse,適合輕量級(jí)業(yè)務(wù)判斷;4.不建議過(guò)度使用Optional,如基本類型或簡(jiǎn)單邏輯中其反而增加復(fù)雜度,部分場(chǎng)景直接返回nu

Java中的可比較與比較器 Java中的可比較與比較器 Jul 13, 2025 am 02:31 AM

在Java中,Comparable用于類內(nèi)部定義默認(rèn)排序規(guī)則,Comparator用于外部靈活定義多種排序邏輯。1.Comparable是類自身實(shí)現(xiàn)的接口,通過(guò)重寫compareTo()方法定義自然順序,適用于類有固定、最常用的排序方式,如String或Integer。2.Comparator是外部定義的函數(shù)式接口,通過(guò)compare()方法實(shí)現(xiàn),適合同一類需要多種排序方式、無(wú)法修改類源碼或排序邏輯經(jīng)常變化的情況。兩者區(qū)別在于Comparable只能定義一種排序邏輯且需修改類本身,而Compar

如何修復(fù)java.io.notserializable Exception? 如何修復(fù)java.io.notserializable Exception? Jul 12, 2025 am 03:07 AM

遇到j(luò)ava.io.NotSerializableException的核心解決方法是確保所有需序列化的類實(shí)現(xiàn)Serializable接口,并檢查嵌套對(duì)象的序列化支持。1.給主類添加implementsSerializable;2.確保類中自定義字段對(duì)應(yīng)的類也實(shí)現(xiàn)Serializable;3.用transient標(biāo)記不需要序列化的字段;4.檢查集合或嵌套對(duì)象中的非序列化類型;5.查看異常信息定位具體哪個(gè)類未實(shí)現(xiàn)接口;6.對(duì)無(wú)法修改的類考慮替換設(shè)計(jì),如保存關(guān)鍵數(shù)據(jù)或使用可序列化的中間結(jié)構(gòu);7.考慮改

如何處理Java中的字符編碼問(wèn)題? 如何處理Java中的字符編碼問(wèn)題? Jul 13, 2025 am 02:46 AM

處理Java中的字符編碼問(wèn)題,關(guān)鍵是在每一步都明確指定使用的編碼。1.讀寫文本時(shí)始終指定編碼,使用InputStreamReader和OutputStreamWriter并傳入明確的字符集,避免依賴系統(tǒng)默認(rèn)編碼。2.在網(wǎng)絡(luò)邊界處理字符串時(shí)確保兩端一致,設(shè)置正確的Content-Type頭并用庫(kù)顯式指定編碼。3.謹(jǐn)慎使用String.getBytes()和newString(byte[]),應(yīng)始終手動(dòng)指定StandardCharsets.UTF_8以避免平臺(tái)差異導(dǎo)致的數(shù)據(jù)損壞??傊?,通過(guò)在每個(gè)階段

Java方法參考解釋了 Java方法參考解釋了 Jul 12, 2025 am 02:59 AM

方法引用是Java中一種簡(jiǎn)化Lambda表達(dá)式的寫法,使代碼更簡(jiǎn)潔。它不是新語(yǔ)法,而是Java8引入的Lambda表達(dá)式的一種快捷方式,適用于函數(shù)式接口的上下文。其核心在于將已有方法直接作為函數(shù)式接口的實(shí)現(xiàn)來(lái)使用。例如System.out::println等價(jià)于s->System.out.println(s)。方法引用主要有四種形式:1.靜態(tài)方法引用(ClassName::staticMethodName);2.實(shí)例方法引用(綁定到特定對(duì)象,instance::methodName);3.

JavaScript數(shù)據(jù)類型:原始與參考 JavaScript數(shù)據(jù)類型:原始與參考 Jul 13, 2025 am 02:43 AM

JavaScript的數(shù)據(jù)類型分為原始類型和引用類型。原始類型包括string、number、boolean、null、undefined和symbol,其值不可變且賦值時(shí)復(fù)制副本,因此互不影響;引用類型如對(duì)象、數(shù)組和函數(shù)存儲(chǔ)的是內(nèi)存地址,指向同一對(duì)象的變量會(huì)相互影響。判斷類型可用typeof和instanceof,但需注意typeofnull的歷史問(wèn)題。理解這兩類差異有助于編寫更穩(wěn)定可靠的代碼。

如何在Java解析JSON? 如何在Java解析JSON? Jul 11, 2025 am 02:18 AM

解析JSON在Java中的常見方式有三種:使用Jackson、Gson或org.json。1.Jackson適合大多數(shù)項(xiàng)目,性能好且功能全面,支持對(duì)象與JSON字符串之間的轉(zhuǎn)換及注解映射;2.Gson更適合Android項(xiàng)目或輕量級(jí)需求,使用簡(jiǎn)單但處理復(fù)雜結(jié)構(gòu)和高性能場(chǎng)景略遜;3.org.json適用于簡(jiǎn)單任務(wù)或小腳本,不推薦用于大型項(xiàng)目,因其靈活性和類型安全不足。選擇應(yīng)根據(jù)實(shí)際需求決定。

See all articles