首頁 Java Java面試題 java面試中常見的陣列題目總結(一)

java面試中常見的陣列題目總結(一)

Nov 06, 2020 pm 03:53 PM
java 陣列 面試

java面試中常見的陣列題目總結(一)

主題難度:* *

(學習影片推薦:java課程

1、排序序

【題目】

傳回一個數字數組的排序值,例如資料[6,2,5,0] 的回傳是[4,2,3,1]

【代碼】

package swear2offer.array;

import java.util.Arrays;

public class SortSequence {
    /**
     * 返回一个数字数组的排序值
     * 比如数据 [6,2,5,0] 的返回是 [4,2,3,1]
     * */
    public int[] compare(int[] a) {
        int i,j,n;
        n = a.length;

        int [] c = new int[n];

		//数组下标从0开始,但是输出的次序从1开始,所以需要初始化数组为1
        for (i=0; i<n; i++) {
           c[i]++;
        }

        for (i=0; i<n; i++) {
            for (j=0; j<i; j++) {
                if (a[j]<a[i]) c[i]++;
                else c[j]++;
            }
        }

        return c;
    }

    public static void main(String[] args) {
        int[] a = {6,2,5,0};
        System.out.println(Arrays.toString(new SortSequence().compare(a)));
    }

}

【思考】

正常的獲得次序的方式是每一個元素都與其他所有元素進行比較,然後獲得大小次序,但是這裡採用的是梯形比較次序

6
6 2
6 2 5
6 2 5 0

比較的時候,不只判斷比較元素,同時也判斷被比較元素,也就是if else的程式碼,這樣可以減少比較次數。

2、陣列下標輔助記錄

【題目】

給定一個陣列a, 長度為N, 元素取值範圍為[1, N],統計各個元素出現的次數,要求時間複雜度為O (N), 空間複雜度為O (1)

#【程式碼】

/**
     * 这类要求空间O(1)时间复杂度为O(n)的问题
     * 需要在一次遍历并且不声明新数组的情况下求解,这种题目通常要求元素大小跟下标大小一致。
     * 所以通常考虑是利用数组存储的元素和数组下标来求解
     * 在本题中,数组的元素变成了下标,而数组内元素则表示之前元素出现的次数,0则代表不出现。
     * 为了区分元素和次数,可以把次数设定为负值
     * */
    public void Solution(int[] a) {
        int i,n,temp;
        n = a.length;

        i = 0;
        /**
         * 只有在temp小于0的时候才会推进循环
         * */
        while(i < n) {
            temp = a[i]-1;
            // 如果数组元素小于0,则代表该数已经被替换到其他地方或者已经被计数过从而被覆盖
            if (temp < 0) {
                i ++;
                continue;
            }
            // 把未记录的数保存在已经记录的位置上,并用负值保存数量
            if (a[temp]>0) {
                a[i] = a[temp];
                a[temp] = -1;
            } else {
                a[i] = 0; //该数据已经使用过,且表示元素i+1出现0次
                a[temp]--;
            }
        }

    }

(圖文教學推薦:java面試題目及答案

3、找出有序二維數組的元素

【題目】

在一個二維數組中(每個一維數組的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組是否含有該整數。

【程式碼】

package swear2offer.array;

public class ArrayFind {

    /**
     * 在一个二维数组中(每个一维数组的长度相同),
     * 每一行都按照从左到右递增的顺序排序,
     * 每一列都按照从上到下递增的顺序排序。
     * 请完成一个函数,输入这样的一个二维数组和一个整数,
     * 判断数组中是否含有该整数。
     *
     * 思路:
     * 从左上出发,需要考虑的情况太多,因为向右和向下都是递增
     * 但是从右上出发,向左递减,向下递增,这样就把情况限定在一种。
     * */
    public boolean Find(int target, int [][] array) {

        int l,h,x,y;
        h = array.length;
        l = array[0].length;

        // 游标的横纵坐标
        x = l-1;
        y = 0;

        while (x>=0 && y<h) {
            if(array[y][x] == target) {
                return true;
            }

            if (array[y][x]<target) {
                y++;
            } else {
                x--;
            }
        }

        return false;
    }

    public static void main(String[] args) {
        int[][] a = {{1,3,5,6},{2,4,7,8},{5,8,9,12}};
        System.out.println(new ArrayFind().Find(11,a));
    }

}

【思考】

從左上出發,需要考慮的情況太多,因為向右和向下都是遞增,但是從右上出發,向左遞減,向下遞增,這樣就把情況限定在一種。特殊的數組,充分利用數組的特殊性,從不同的方向考慮方法。

4、跳台階

【題目】

一隻青蛙一次可以跳上 1 級台階,也可以跳上 2 級。求該青蛙跳上一個 n 級的階梯總共有多少種跳法(先後次序不同算不同的結果)。

【程式碼】

package swear2offer.array;

public class Floors {

    /**
     * 一只青蛙一次可以跳上 1 级台阶,也可以跳上 2 级。
     * 求该青蛙跳上一个 n 级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
     *
     * 获取跳法次数
     * */
    public int JumpFloor(int target) {

        if (target < 3) return target;

        // 大于等于3个台阶,次数是第一步调1下和跳2下的个数之和
        return JumpFloor(target-1) + JumpFloor(target-2);

    }
}

5、變態跳台階

【題目】

#一隻青蛙一次可以跳上1 級台階,也可以跳上2 級… 它也可以跳上n 級。求該青蛙跳上一個 n 級的階梯總共有多少種跳法。

【程式碼】

package swear2offer.array;

import java.util.Arrays;

public class FloorsPlus {

    /**
     * 一只青蛙一次可以跳上 1 级台阶,
     * 也可以跳上 2 级…… 它也可以跳上 n 级。
     * 求该青蛙跳上一个 n 级的台阶总共有多少种跳法。
     *
     * 动态规划:数组代表含义、边界、转换公式
     * 动态规划最重要的是找出阶段之间的变化公式,
     * 即,n-1和n之间的状态是如何转移的
     *
     * f[n]:n阶台阶的跳法
     * f[n] = f[n-1]+f[n-2]+...+f[1]+f[0]
     * f[n-1]代表最后一步走了1步
     * f[n-2]代表最后一步走了2步
     * f[1]代表最后一步走了n-1步
     * f[0]代表最后一步走了n步
     *
     * 这里需要注意,f[0]=0,但是最后一步走了n步也算一种方法,
     * 所以需要初始化把数组初始化为1,或则单独处理f[0].
     *
     * */
    public int JumpFloorII(int target) {
        if (target < 3) return target;
        int[] f = new int[target+1];
        //单独处理f[0]
        f[0] = 1;
        f[1] = 1;//边界

        int i,j;
        for (i=2; i<=target; i++) {
            for (j=i-1; j>=0; j--) {
                f[i] += f[j];
            }
        }

        return f[target];
    }
    
    public int JumpFloorII2(int target) {
        if (target < 3) return target;
        int[] f = new int[target+1];

        //初始化把数组初始化为1
        Arrays.fill(f,1);
        f[0] = 0;
        f[1] = 1;//边界

        int i,j;
        for (i=2; i<=target; i++) {
            for (j=i-1; j>0; j--) {
                f[i] += f[j];
            }
        }

        return f[target];
    }
}

相關推薦:java入門

#

以上是java面試中常見的陣列題目總結(一)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Laravel Lazy Loading與急切的加載 Laravel Lazy Loading與急切的加載 Jul 28, 2025 am 04:23 AM

懶加載在訪問關聯時才查詢,易導致N 1問題,適合不確定是否需要關聯數據的場景;2.急加載使用with()提前加載關聯數據,避免N 1查詢,適合批量處理場景;3.應優先使用急加載優化性能,可通過LaravelDebugbar等工具檢測N 1問題,並謹慎使用模型的$with屬性以避免不必要的性能開銷。

將PHP與機器學習模型集成 將PHP與機器學習模型集成 Jul 28, 2025 am 04:37 AM

usearestapitobridgephpandmlmodelsbyrunningthemodelinpythonviaflaskorfastapiandcallingitfromphpusingcurlorguzzle.2.runpythonscriptsdirectsdirectlyectlyectlyfromphpsingexec()orshell_exec()orshell_exec()orshell_exec()

Laravel Raw SQL查詢示例 Laravel Raw SQL查詢示例 Jul 29, 2025 am 02:59 AM

Laravel支持使用原生SQL查詢,但應優先使用參數綁定以確保安全;1.使用DB::select()執行帶參數綁定的SELECT查詢,防止SQL注入;2.使用DB::update()執行UPDATE操作並返回影響行數;3.使用DB::insert()插入數據;4.使用DB::delete()刪除數據;5.使用DB::statement()執行如CREATE、ALTER等無結果集的SQL語句;6.推薦在QueryBuilder中使用whereRaw、selectRaw等方法結合原生表達式以提升安

優化Java應用程序中的內存使用率 優化Java應用程序中的內存使用率 Jul 28, 2025 am 02:40 AM

使用效率效率DatAstructuresLikeArrayLinkedLinkedLinkedListAndPrimitiveCollectionStoreCuceOverHead; 2.MinimizeObjectCreationByReosizobsobjects,usingsTringBuilderBuilderForforConcatenation,andCachingInation,andCachingingObjects; 3.PreventMemoryLeakSbySbyNullifyingReperences,lunterStatics interStatics interstatics

python三元操作員示例 python三元操作員示例 Jul 28, 2025 am 02:57 AM

Python的三元運算符用於簡潔地實現if-else判斷,其語法為“value_if_trueifconditionelsevalue_if_false”;1.可用於簡單賦值,如根據數值正負返回對應字符串;2.可避免除零錯誤,如判斷分母非零再進行除法;3.可在字符串格式化中根據條件選擇內容;4.可在列表推導式中為不同元素分配標籤;需注意該運算符僅適用於二分支情況,不宜多層嵌套,複雜邏輯應使用傳統if-elif-else結構以保證可讀性。

帶有項目反應堆和彈簧WebFlux的Java的反應性編程 帶有項目反應堆和彈簧WebFlux的Java的反應性編程 Jul 29, 2025 am 12:04 AM

響應式編程在Java中通過ProjectReactor和SpringWebFlux實現高並發、低延遲的非阻塞服務。 1.ProjectReactor提供Mono和Flux兩個核心類型,支持聲明式處理異步數據流,並通過操作符鏈進行轉換、過濾等操作;2.SpringWebFlux基於Reactor構建,支持註解式和函數式兩種編程模型,運行在Netty等非阻塞服務器上,可高效處理大量並發連接;3.使用WebFlux Reactor能提升I/O密集型場景下的並發能力與資源利用率,天然支持SSE、WebSo

CSS桌面固定示例 CSS桌面固定示例 Jul 29, 2025 am 04:28 AM

table-layout:fixed會強製表格列寬由第一行單元格寬度決定,避免內容影響佈局。 1.設置table-layout:fixed並指定表格寬度;2.為第一行th/td設置具體列寬比例;3.配合white-space:nowrap、overflow:hidden和text-overflow:ellipsis控製文本溢出;4.適用於後台管理、數據報表等需穩定佈局和高性能渲染的場景,能有效防止佈局抖動並提升渲染效率。

記事本查找並替換為正則捕獲組 記事本查找並替換為正則捕獲組 Jul 28, 2025 am 02:17 AM

在Notepad 中使用正則表達式捕獲組可有效重組文本,首先需打開替換對話框(Ctrl H),選擇“搜索模式”為“正則表達式”,1.使用()定義捕獲組,如(\w )捕獲單詞;2.在替換框中用\1、\2引用對應組;3.示例:交換姓名“JohnDoe”為“Doe,John”,查找(\w )\s (\w ),替換為\2,\1;4.日期格式轉換2023-12-25為25/12/2023,查找(\d{4})-(\d{2})-(\d{2}),替換為\3/\2/\1;5.日誌重排可提取時間、級別、ID等信息

See all articles