ホームページ Java &#&面接の質問 Java 面接でよくある配列に関する質問のまとめ (5)

Java 面接でよくある配列に関する質問のまとめ (5)

Nov 16, 2020 pm 03:41 PM
java 配列 インタビュー

Java 面接でよくある配列に関する質問のまとめ (5)

1. ソートされた配列に数値が出現する回数

[タイトル]

ソートされた配列に数値が出現する回数をカウントします。配列。

(学習ビデオの推奨: java ビデオ チュートリアル )

[コード]

public int GetNumberOfK(int [] array , int k) {

        if (array.length==0 || array==null) return 0;

        int i,n,count;
        n = array.length;

        count = 0;
        for (i=0; i<n; i++) {
            if (array[i] == k) count++;
        }

        return count;
    }

    public int high(int[] a, int k) {
        int start,end,mid;

        start = 0;
        end = a.length-1;

        while (start <= end) {
            mid = (start + end) >> 1;
            if (a[mid] <= k) {
                start = mid + 1;
            } else {
                end = mid - 1;
            }
        }

        return end;
    }

    public int low(int[] a, int k) {
        int start,end,mid;

        start = 0;
        end = a.length-1;

        while (start <= end) {
            mid = (start + end) >> 1;
            if (a[mid] >= k) {
                end = mid - 1;
            } else {
                start = mid + 1;
            }
        }

        return start;
    }
ログイン後にコピー

[考え方]

配列はa ソートされた配列なので、二分探索を使用して k の最初と最後の出現を見つけることができます。時間計算量は O(logN)O(logN)

です 二分探索の前提条件: 順序付け (順序に関しては) )

2. Find 1 2 3 … n

[タイトル]

Find 1 2 3 … n、リクエスト キーワード乗除算、for、while、if、else、switch、case、条件判定文(A?B:C)は使用できません。

[コード]

	public int Sum_Solution(int n) {
        int sum = n;
        boolean flag = (sum > 0) && (sum += Sum_Solution(n-1))>0;
        return sum;
    }
ログイン後にコピー

思考]

ループや判定が使えないことが要求されるため、ループの代わりに再帰を使用し、短絡原理を使用します

# 短絡と実行の順序は左から右であり、最初の式の値が false であると判断された後、2 番目の条件文を実行する必要はありません。 2 番目の条件が true か false かに関係なく、式全体のブール値は false でなければならないことは明らかであるためです。短絡すると 2 番目の条件がスキップされ、実行されません。これらの原則に基づいて、上記の結果が得られました。短絡とプログラミングを柔軟に使用することは非常に重要です。

n=0, sum=0の場合、&&以降は実行されず、直接sum=0が返されます

3. ロープを切ります

[タイトル]

長さ n のロープがある場合、ロープを整数の長さの m 個のセグメントに切断してください (m と n は両方とも整数、n > 1 および m > 1)。ロープの各セグメントの長さが記録されます。 k [0]、k[1]、…、k[m]として。 k [0] xk [1] x...xk [m] の最大の積は何ですか?たとえば、ロープの長さが 8 の場合、長さ 2、3、3 の 3 つに切断しますが、このとき得られる製品の最大値は 18 になります。

【コード】

    /**
     * 给你一根长度为 n 的绳子,请把绳子剪成整数长的 m 段(m、n 都是整数,n>1 并且 m>1),
     * 每段绳子的长度记为 k [0],k [1],...,k [m]。
     * 请问 k [0] xk [1] x...xk [m] 可能的最大乘积是多少?
     * 例如,当绳子的长度是 8 时,
     * 我们把它剪成长度分别为 2、3、3 的三段,此时得到的最大乘积是 18。
     *
     * 使用动态规划
     * 要点:边界和状态转移公式
     * 使用顺推法:从小推到大
     * dp[x] 代表x的最大值
     * dp[x] = max{d[x-1]*1,dp[x-2]*2,dp[x-3]*3,,,,},不需要全遍历,取半即可
     * */
    public int cutRope(int target) {

        // 由于2,3是划分的乘积小于自身,对状态转移会产生额外判断
        if (target <= 3) return target-1;
        int[] dp = new int[target+1];
        int mid,i,j,temp;

        // 设定边界
        dp[2] = 2;
        dp[3] = 3;

        for (i=4; i<=target; i++) {
            // 遍历到中间即可
            mid = i >> 1;
            // 暂存最大值
            temp = 0;
            for (j=1; j<=mid; j++) {
                if (temp < j*dp[i-j]) {
                    temp = j*dp[i-j];
                }
            }
            dp[i] = temp;
        }

        return dp[target];

    }
ログイン後にコピー

考え方


 *
 * 使用动态规划
 * 要点:边界和状态转移公式
 * 使用顺推法:从小推到大
 * dp[x] 代表x的最大值
 * dp[x] = max{d[x-1]*1,dp[x-2]*2,dp[x-3]*3,,,,},不需要全遍历,取半即可
 * 但是需要注意。2和3这两个特殊情况,因为他们的分解乘积比自身要大,所以特殊处理
ログイン後にコピー

(その他の関連するインタビューの質問を共有します:

Java インタビューの質問と回答)

4. スライディング ウィンドウの最大値

[タイトル]

配列とスライディング ウィンドウのサイズを指定して、スライディング ウィンドウ内のすべての値の最大値を見つけます。窓。たとえば、入力配列が {2,3,4,2,6,2,5,1} で、スライディング ウィンドウのサイズが 3 の場合、合計 6 つのスライディング ウィンドウとその最大値が存在します。 are {4,4,6, 6,6,5}; 配列 {2,3,4,2,6,2,5,1} には次の 6 つのスライディング ウィンドウがあります: {[2,3, 4],2,6,2,5 ,1}、{2,[3,4,2],6,2,5,1}、{2,3,[4,2,6],2,5 ,1}、{2,3,4 ,[2,6,2],5,1}、{2,3,4,2,[6,2,5],1}、{2,3,4 ,2,6,[2,5,1]}。

【コード】

package swear2offer.array;

import java.util.ArrayList;

public class Windows {

    /**
     * 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。
     * 例如,如果输入数组 {2,3,4,2,6,2,5,1} 及滑动窗口的大小 3,
     * 那么一共存在 6 个滑动窗口,他们的最大值分别为 {4,4,6,6,6,5}
     *
     * 思路:
     * 先找出最开始size大小的最大值,以及这个最大值的下标
     * 然后每次增加一个值,先判断滑动窗口的第一位下标是否超过保存最大值的下标
     * 如果超过就要重新计算size区域的最大值,
     * 如果未超过就使用最大值与新增的元素比较,获取较大的
     * */
    public ArrayList<Integer> maxInWindows(int [] num, int size) {
        ArrayList<Integer> list = new ArrayList<>();
        int i;
        int[] temp;
        temp = getMax(num,0,size);

        if (size<=0 || num==null || num.length==0) return list;

        // 当窗口大于数组长度
        if (num.length <= size) return list;

        // 把第一个滑动窗口最大值加入数组
        list.add(temp[0]);

        // 从新的窗口开始计算,上一个窗口的最大值和下标保存在temp中
        for (i=size; i<num.length; i++) {
            // 上一个最大值还在滑动窗口区域内
            if (i-size < temp[1]) {
                if (temp[0] < num[i]) {
                    temp[0] = num[i];
                    temp[1] = i;
                }
            } else {
                temp = getMax(num,i-size+1,size);
            }
            list.add(temp[0]);
        }

        return list;
    }

    public int[] getMax (int[] num, int s, int size) {
        int [] res = new int[2];
        int e = s + size;
        // 当窗口大于数组长度
        if (e>num.length) e = num.length;

        int temp = Integer.MIN_VALUE;
        int k = 0;
        for (int i=s; i<e; i++) {
            if (temp < num[i]) {
                temp = num[i];
                k = i;
            }
        }

        res[0] = temp;
        res[1] = k;

        return res;
    }

}
ログイン後にコピー

* アイデア:

* まず、初期サイズの最大値と、この最大値の添え字を見つけます

* 次に、値が追加されるたびに、まずスライディング ウィンドウの最初の添字が最大値を保存する添字を超えているかどうかを判断します

* 超えている場合は、サイズ領域の最大値を再計算する必要があります、

※超えていない場合は、最大値を使用して新しい要素と比較し、より大きな値を取得します

補足:今回の質問でスローされる例外については、例えばサイズの場合>num.length は Throwing null ですが、これが最大の Throwing だと思いますので、この時点で面接官とコミュニケーションをとるべきです。

5. 配列内の繰り返し番号

[タイトル]

長さ n の配列内のすべての数値は、0 から n-1 の範囲内にあります。配列内のいくつかの数値が繰り返されていますが、いくつの数値が繰り返されているのかわかりません。各数字が何回繰り返されるかはわかりません。配列内で繰り返される数値を見つけてください。たとえば、入力が長さ 7 の配列 {2,3,1,0,2,5,3} の場合、対応する出力は最初に繰り返される数値 2 になります。

【コード】

    /**
     * 在一个长度为 n 的数组里的所有数字都在 0 到 n-1 的范围内。
     * 数组中某些数字是重复的,但不知道有几个数字是重复的。
     * 也不知道每个数字重复几次。请找出数组中任意一个重复的数字。
     * 例如,如果输入长度为 7 的数组 {2,3,1,0,2,5,3},
     * 那么对应的输出是第一个重复的数字 2。
     *
     * 思路:
     * 看到 长度n,内容为0-n-1;瞬间就应该想到,元素和下标的转换
     *
     * 下标存的是元素的值,对应的元素存储出现的次数,
     * 为了避免弄混次数和存储元素,把次数取反,出现一次则-1,两次则-2
     * 把计算过的位置和未计算的元素交换,当重复的时候,可以用n代替
     * */
    public boolean duplicate(int numbers[],int length,int [] duplication) {

        if (length == 0 || numbers == null) {
            duplication[0] = -1;
            return false;
        }

        int i,res;
        i = 0;
        while (i < length) {
            // 获取到数组元素
            res = numbers[i];
            // 判断对应位置的计数是否存在
            if (res < 0 || res == length) {
                i++;
                continue;
            }

            if (numbers[res] < 0) {
                numbers[res] --;
                numbers[i] = length;
                continue;
            }

            numbers[i] = numbers[res];
            numbers[res] = -1;
        }

        res = 0;
        for (i=0; i<length; i++) {
            if (numbers[i] < -1) {
                duplication[res] = i;
                return true;
            }
        }

        return false;
    }
ログイン後にコピー
* アイデア:

* 長さ n と内容が 0-n-1 を見たとき、すぐに次の変換を考える必要があります。要素と添字

* 添字には要素の値が格納され、対応する要素には出現回数が格納されます。

* 数値と格納された要素の混同を避けるため、数値は反転します。1 回出現した場合は -1、2 回出現した場合は -2

* 計算された位置を計算されていない要素と交換します。繰り返す場合は、代わりに n を使用できます

関連する推奨事項:

Java 入門

以上がJava 面接でよくある配列に関する質問のまとめ (5)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Javaの完全数 Javaの完全数 Aug 30, 2024 pm 04:28 PM

Java における完全数のガイド。ここでは、定義、Java で完全数を確認する方法、コード実装の例について説明します。

ジャワのウェカ ジャワのウェカ Aug 30, 2024 pm 04:28 PM

Java の Weka へのガイド。ここでは、weka java の概要、使い方、プラットフォームの種類、利点について例を交えて説明します。

Javaのスミス番号 Javaのスミス番号 Aug 30, 2024 pm 04:28 PM

Java のスミス番号のガイド。ここでは定義、Java でスミス番号を確認する方法について説明します。コード実装の例。

Java Springのインタビューの質問 Java Springのインタビューの質問 Aug 30, 2024 pm 04:29 PM

この記事では、Java Spring の面接で最もよく聞かれる質問とその詳細な回答をまとめました。面接を突破できるように。

Java 8 Stream Foreachから休憩または戻ってきますか? Java 8 Stream Foreachから休憩または戻ってきますか? Feb 07, 2025 pm 12:09 PM

Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです

Java での日付までのタイムスタンプ Java での日付までのタイムスタンプ Aug 30, 2024 pm 04:28 PM

Java での日付までのタイムスタンプに関するガイド。ここでは、Java でタイムスタンプを日付に変換する方法とその概要について、例とともに説明します。

カプセルの量を見つけるためのJavaプログラム カプセルの量を見つけるためのJavaプログラム Feb 07, 2025 am 11:37 AM

カプセルは3次元の幾何学的図形で、両端にシリンダーと半球で構成されています。カプセルの体積は、シリンダーの体積と両端に半球の体積を追加することで計算できます。このチュートリアルでは、さまざまな方法を使用して、Javaの特定のカプセルの体積を計算する方法について説明します。 カプセルボリュームフォーミュラ カプセルボリュームの式は次のとおりです。 カプセル体積=円筒形の体積2つの半球体積 で、 R:半球の半径。 H:シリンダーの高さ(半球を除く)。 例1 入力 RADIUS = 5ユニット 高さ= 10単位 出力 ボリューム= 1570.8立方ユニット 説明する 式を使用してボリュームを計算します。 ボリューム=π×R2×H(4

Spring Tool Suiteで最初のSpring Bootアプリケーションを実行するにはどうすればよいですか? Spring Tool Suiteで最初のSpring Bootアプリケーションを実行するにはどうすればよいですか? Feb 07, 2025 pm 12:11 PM

Spring Bootは、Java開発に革命をもたらす堅牢でスケーラブルな、生産対応のJavaアプリケーションの作成を簡素化します。 スプリングエコシステムに固有の「構成に関する慣習」アプローチは、手動のセットアップを最小化します。

See all articles