技術共有

【秋採用突破】2024年秋採用筆記試験-ByteDance筆記試験問題-01-3言語問題解答(Java/Cpp/Python)

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

🍭 大家好这里是清隆先輩 , アルゴリズムが大好きなプログラマーです。

💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导

✨ このシリーズは今後も更新していく予定です Qiuzhaoの筆記試験の問題
👏 感谢大家的订阅➕ 和 喜欢💗


📧 清隆这边最近正在收集近一年半互联网笔试题汇总,有需要的小伙伴可以关注 記事の終わり プリンセスクルーズに乗ろう〜

ここに画像の説明を挿入します

🎀 01.A先生的环形花圃

質問の説明

Aさんは円形の花壇を持っており、 んん ブロックエリア。 Aさんは当初、バラを植える花壇のエリアを3つ選択しました。

今、A さんは移動運用を使ってお花畑を届けたいと考えています。バランスの取れた状態

バランスの取れた状態: バラが植えられている 2 つのエリア間の距離が少なくとも えーっ(隣接するエリア間の距離は 1 1 1)。

移動操作:隣接するエリアのステータスを交換します(バラエリアが空きエリアになり、空きエリアがバラエリアになります)。

一方で、Aさんは効率を重視する人なので、最小限の手数で花壇のバランスを整えてほしいと考えています。

入力フォーマット

最初の行に正の整数を入力します ttt、問い合わせの数を示します。

ttt 行、各行には 5 つの正の整数が含まれます んん えーっ 1 1_11つの1 2 ...1つの2 3 a_31つの3、それぞれ花壇エリアの数、必要な最小距離、および 3 つのバラ エリアの初期位置を表します。

出力フォーマット

出力 ttt 各行は、花壇を平衡状態にするために必要な交換の最小数を表す整数を出力します。平衡に達しない場合は出力 − 1 -1 1

サンプル入力

3
5 1 1 2 3
5 2 1 2 3
6 2 2 3 6
  • 1
  • 2
  • 3
  • 4

サンプル出力

0
-1
1
  • 1
  • 2
  • 3

データ範囲

1 ≤ t ≤ 1 0 4 1 ≤ t ≤ 10^41t104
1 ≤ n ≤ 1 0 9 1 ≤ n ≤ 10^91109
1 ≤ k 、a 1 、a 2 、a 3 ≤ n 1 ≤ k、a_1、a_2、a_3 ≤ n1,1つの1,1つの2,1つの3

答え

この問題は平衡状態を分析することで解決できます。

まず、必要な最小距離の場合 えーっ ガーデンエリア数を超えました んん の 3 分の 1 の場合、どのような場合でも条件を満たすことができず、出力は次のようになります。 − 1 -1 1

それ以外の場合は、まず 3 つのバラ領域の位置を並べ替えてから、隣接するバラ領域間の距離を計算します。次に、距離ごとに、それが以下の場合は、 えーっの場合、移動操作が必要となり、移動回数は えーっ この距離からの違い。

最後に、すべての距離が要件を満たすと、花壇はバランスの取れた状態に達し、合計移動数を出力できるようになります。

時間計算量は O ( t log ⁡ t ) O(t log t)(t見よt)、空間の複雑さは オー(1)オー(1)(1)

参照コード

  • パイソン
t = int(input())

for _ in range(t):
    n, k, *a = map(int, input().split())
    a.sort()

    if k * 3 > n:
        print(-1)
        continue

    b = [a[1] - a[0], a[2] - a[1], n - a[2] + a[0]]
    ans = sum(max(0, k - d) for d in b)

    print(ans)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • ジャワ
import java.util.Arrays;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int t = sc.nextInt();

        while (t-- > 0) {
            int n = sc.nextInt();
            int k = sc.nextInt();
            int[] a = new int[3];
            for (int i = 0; i < 3; i++) {
                a[i] = sc.nextInt();
            }

            Arrays.sort(a);

            if (k * 3 > n) {
                System.out.println(-1);
                continue;
            }

            int[] b = {a[1] - a[0], a[2] - a[1], n - a[2] + a[0]};
            int ans = 0;
            for (int d : b) {
                ans += Math.max(0, k - d);
            }

            System.out.println(ans);
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • Cpp
#include <iostream>
#include <algorithm>

using namespace std;

int main() {
    int t;
    cin >> t;

    while (t--) {
        int n, k, a[3];
        cin >> n >> k >> a[0] >> a[1] >> a[2];

        sort(a, a + 3);

        if (k * 3 > n) {
            cout << -1 << endl;
            continue;
        }

        int b[] = {a[1] - a[0], a[2] - a[1], n - a[2] + a[0]};
        int ans = 0;
        for (int d : b) {
            ans += max(0, k - d);
        }

        cout << ans << endl;
    }

    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

🪐 02.卢小姐的音游金币

問題の説明

ルーさんは最近、ピアノの音を中心とした音楽ゲームにハマっています。ゲームでは、各ピアノ タイルに番号があり、最小番号は次のとおりです。 1 1 1 。数字が増加するピアノタイルを 5 つ連続して叩くと、金貨が得られます。

たとえば、ミス・ルーが番号付きの数字を打った場合、 1, 2, 3, 4, 5, 6 ピアノ曲、その後1, 2, 3, 4, 5 数字が連続して増加するこれら 5 つのブロックで、彼女は金貨を獲得します。

レベルを長時間プレイすると、番号はリセットされ、リセットされた番号は から変わります。 1 1 1 始める。したがって、レベルでは、同じ番号で異なる番号を持つ複数のピアノ タイルを叩くことが可能です。

金貨を獲得するには、同じレベルで数字が増え続けるピアノ タイルが 5 つだけ必要であることに注意してください。

ミス・ルーの優れた力により、彼女は 4 つのレベルを突破しました。Miss Lu には 4 つの難易度レベルが与えられました AA BBB CC そして DD ピアノ タイルのヒット数。Lu さんはこれら 4 つのレベルで合計何枚の金貨を獲得できますか?

入力フォーマット

最初の行には正の整数が含まれています んん 1 ≤ n ≤ 1 0 5 1 ≤ n ≤ 10^51105)、4 つのレベルで Miss Lu がヒットしたピアノ タイルの合計数を表します。

んん 各行に 3 つのパラメータを入力します。 あいあい1つの ビビb 1 ≤ ai 、 bi ≤ 1 0 9 1 ≤ a_i、b_i ≤ 10^911つの,b109)そして ci c_ic ci ∈ { ′ A ′ , ′ B ′ , ′ C ′ , ′ D ′ } c_i は {'A', 'B', 'C', 'D'} に含まれるc{,B,,})、それぞれ各ピアノ タイルの数、数量、レベルを表します。

出力フォーマット

Miss Lu が取得できる金貨の総数を表す整数を出力します。

サンプル入力

11
1 1 A
2 2 A
3 2 A
4 2 A
5 2 A
6 1 A
7 1 B
8 2 B
9 2 B
10 2 B
11 1 B
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

サンプル出力

3
  • 1

サンプル概要

レベル用 AA、初め 1, 2, 3, 4, 5 金貨を入手すると、2, 3, 4, 5, 6 別の金貨を入手できます。

レベル用 BBB7, 8, 9, 10, 11 金貨が手に入る。

したがって、合計 3 3 3 金貨。

サンプル入力 2

5
1 1 C
2 2 C
3 2 C 
4 2 C
6 1 C
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

サンプル出力 2

0
  • 1

サンプル説明 2

レベルで CC では5回連続で増加する数字は得られないため、金貨の枚数は 0 0 0

データ範囲

  • 1 ≤ n ≤ 1 0 5 1 ≤ n ≤ 10^51105
  • 1 ≤ ai 、 bi ≤ 1 0 9 1 ≤ a_i、b_i ≤ 10^911つの,b109
  • ci ∈ { ′ A ′ , ′ B ′ , ′ C ′ , ′ D ′ } c_i は {'A', 'B', 'C', 'D'} に含まれるc{,B,,}

答え

この問題は、ハッシュ テーブルとソートを使用して解決できます。具体的な考え方は以下のとおりです。

  1. ハッシュテーブルを使用する cnt 各レベルで各数字が出現する回数を記録します。キーはレベルの文字と数字の組み合わせで、値はレベル内で数字が出現する回数です。

  2. レベルの文字と数値に従って入力データを並べ替え、同じレベルの数値が連続していることを確認します。

  3. 並べ替えられたデータをスキャンし、各数値について、その 5 つの連続する数値がすべて現在のレベルに存在するかどうかを判断します。存在する場合は、これら 5 つの数値の出現数の最小値を取得し、それを答えに含めて、これら 5 つの数値の出現数から最小値を減算します。

  4. 最終的な答えは、条件を満たすすべての金貨の合計です。

時間計算量は O ( n log ⁡ n ) O(n log n)(見よ)、空間の複雑さは O(n) は、()

参照コード

  • パイソン
from collections import defaultdict
import sys

def solve():
    n = int(input())
    cnt = defaultdict(int)
    vec = []

    for _ in range(n):
        a, b, c = input().split()
        a, b = int(a), int(b)
        cnt[c + str(a)] += b
        vec.append((c, a))

    vec.sort()

    ans = 0
    for v in vec:
        arr = [v[0] + str(v[1] + i) for i in range(5)]
        t = min(cnt[a] for a in arr)
        ans += t
        for a in arr:
            cnt[a] -= t

    print(ans)

if __name__ == '__main__':
    solve()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • ジャワ
import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());

        Map<String, Integer> cnt = new HashMap<>();
        List<int[]> vec = new ArrayList<>();

        for (int i = 0; i < n; i++) {
            String[] input = br.readLine().split(" ");
            int a = Integer.parseInt(input[0]);
            int b = Integer.parseInt(input[1]);
            String c = input[2];
            String key = c + a;
            cnt.put(key, cnt.getOrDefault(key, 0) + b);
            vec.add(new int[]{c.charAt(0), a});
        }

        vec.sort((x, y) -> {
            if (x[0] != y[0]) {
                return x[0] - y[0];
            }
            return x[1] - y[1];
        });

        long ans = 0;
        for (int[] v : vec) {
            String[] arr = new String[5];
            for (int i = 0; i < 5; i++) {
                arr[i] = (char) v[0] + String.valueOf(v[1] + i);
            }
            int t = Integer.MAX_VALUE;
            for (String a : arr) {
                t = Math.min(t, cnt.getOrDefault(a, 0));
            }
            ans += t;
            for (String a : arr) {
                cnt.put(a, cnt.get(a) - t);
            }
        }

        System.out.println(ans);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • Cpp
#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
#include <climits>
using namespace std;

using ll = long long;

int main() {
    int n;
    cin >> n;
    map<string, ll> cnt;
    vector<pair<string, int>> vec;

    for (int i = 1; i <= n; i++) {
        int a, b;
        string c;
        cin >> a >> b >> c;
        cnt[c + to_string(a)] += b;
        vec.push_back({c, a});
    }

    sort(vec.begin(), vec.end());

    ll ans = 0;
    for (auto& v : vec) {
        vector<string> arr;
        for (int i = 0; i < 5; i++) {
            arr.push_back(v.first + to_string(v.second + i));
        }
        ll t = LLONG_MAX;
        for (auto& a : arr) {
            t = min(t, cnt[a]);
        }
        ans += t;
        for (auto& a : arr) {
            cnt[a] -= t;
        }
    }

    cout << ans << endl;

    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45

✨ 03. ルー先生のユニークな庭園

問題の説明

ミス・ルーの長さは んん が植えられた庭で んん さまざまな花を植えます。どの花にも美しさの価値がある あいあい1つの

ルーさんは、美しい庭園はユニークであるべきだと感じています。 n − 1 n-11 植えられた花の美しさの価値は同じですが、 1 1 1 植えられた花の美しさは他の花とは異なります。

操作ごとに、ミス・ルーは花を選択し、その美しさの価値を高めることができます。 1 1 1 またはマイナス 1 1 1

さて、ルーさんは、庭をユニークなものにするためにどれくらいの作業が必要になるかを知りたいと考えています。

入力フォーマット

最初の行には正の整数が含まれています んん、庭の長さを示します。

2行目には次の内容が含まれます んん 正の整数 a 1 、 a 2 、 … 、 a_1、 a_2、 ldots、 a_n1つの1,1つの2,,1つの、それぞれの花の美しさの値を示します。

出力フォーマット

庭園を一意にするために必要な操作の最小数を表す整数を出力します。

サンプル入力

4
1 2 3 4
  • 1
  • 2

サンプル出力

2
  • 1

データ範囲

  • 1 ≤ n ≤ 1 0 5 1 ≤ n ≤ 10^51105
  • 1 ≤ ai ≤ 1 0 9 1 ≤ a_i ≤ 10^911つの109

答え

最適な解決策は、中央値になり、中央値になるためのすべてのコストを列挙することです。

時間計算量は O ( n log ⁡ n ) O(n log n)(見よ)、空間の複雑さは O(n) は、()

参照コード

  • パイソン
def main():
    n = int(input())
    w = list(map(int, input().split()))
    w.sort()
    if w[0] == w[n - 1]:
        print("1")
        return
    s1, s2 = 0, 0
    m1, m2 = w[(n - 1) // 2], w[(n + 1) // 2]
    for i in range(n - 1):
        s1 += abs(m1 - w[i])
    for i in range(1, n):
        s2 += abs(m2 - w[i])
    print(min(s1, s2))

if __name__ == "__main__":
    main()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • ジャワ
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int[] w = new int[n];
        for (int i = 0; i < n; i++)
            w[i] = scanner.nextInt();
        Arrays.sort(w);
        if (w[0] == w[n - 1]) {
            System.out.println("1");
            return;
        }
        long s1 = 0, s2 = 0;
        int m1 = w[(n - 1) / 2], m2 = w[(n + 1) / 2];
        for (int i = 0; i < n - 1; i++)
            s1 += Math.abs(m1 - w[i]);
        for (int i = 1; i < n; i++)
            s2 += Math.abs(m2 - w[i]);
        System.out.println(Math.min(s1, s2));
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • Cpp
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
typedef long long ll;
const int N = 100010;

int main() {
    int n, w[N];
    cin >> n;
    for (int i = 0; i < n; i++)
        cin >> w[i];
    sort(w, w + n);
    if (w[0] == w[n - 1]) {
        cout << "1" << endl;
        return 0;
    }
    ll s1 = 0, s2 = 0;
    int m1 = w[(n - 1) / 2], m2 = w[(n + 1) / 2];
    for (int i = 0; i < n - 1; i++)
        s1 += abs(m1 - w[i]);
    for (int i = 1; i < n; i++)
        s2 += abs(m2 - w[i]);
    cout << min(s1, s2) << endl;
    return 0;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

🥝 04.LYA的字符画

質問の説明

LYA は最近、キャラクター ペイントに夢中になっています。キャラクター ペイントの美しさは、キャラクター ペイント内に連続する同じシンボルの数に等しいと信じています。たとえば、「aabbccddef」というキャラクターの絵の美しさは次のとおりです。 6 6 6

LYA さんの友人が彼女に贈ったのは、 0 0 0 そして 1 1 1 キャラクターを描くことに夢中になったLYAは、この文字列を構成するすべての文字列を知りたいと考えています。部分文字列美学の合計は何でしょうか?

注: があります C n + 1 2 C^{2}_{n+1}+12 部分文字列。

入力フォーマット

最初の行に正の整数を入力します んん、文字列の長さを示します。

2行目の長さは んん 01 01 01 弦。

出力フォーマット

すべての部分文字列の美しさの合計を表す整数を出力します。

サンプル入力

4
0011
  • 1
  • 2

サンプル出力

14
  • 1

データ範囲

1 ≤ n ≤ 2 × 1 0 5 1 ≤ n ≤ 2 倍 10^512×105

答え

この問題は、プレフィックスサムの考え方によって解決できます。

まず、文字列の部分文字列の合計数を計算できます。 n ( n + 1 ) 2 の分数{n(n+1)}{2}2(+1)

次に、文字列を反復処理し、変数を使用します。 lll 現在の連続する同一シンボルの開始位置を記録します。変数 rrr 現在位置を記録します。いつ s [ r ] ≠ s [ r − 1 ] s[r] ≠ s[r-1]s[r]=s[r1] のときは、新しいシンボルが出現し、計算できることを意味します。 [ 左 、 右 ) [ 左 、 右 )[l,r) 区間内の部分文字列の数、つまり ( r − l ) ( r − l + 1 ) 2 frac{(rl)(r-l+1)}{2}2(rl)(rl+1)、部分文字列の合計数からそれを減算します。

最後に残るのは、出力できるすべての美しい部分文字列の数です。

時間の複雑さ O(n) は、()、空間の複雑さ オー(1)オー(1)(1)

参照コード

  • パイソン
def cal(length):
    return length * (length + 1) // 2

n = int(input())
s = input() + '#'

ans = 0
total = cal(n)
l = 0
for r in range(1, n + 1):
    if s[r] != s[r - 1]:
        ans += total - cal(l) - cal(n - r)
        l = r

print(ans)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • ジャワ
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        String s = sc.next() + "#";
        
        long ans = 0;
        long total = cal(n);
        int l = 0;
        for (int r = 1; r <= n; r++) {
            if (s.charAt(r) != s.charAt(r - 1)) {
                ans += total - cal(l) - cal(n - r);
                l = r;
            }
        }
        System.out.println(ans);
    }
    
    private static long cal(int len) {
        return (long) len * (len + 1) / 2;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • Cpp
#include <iostream>
#include <string>

using namespace std;

using ll = long long;

ll cal(int len) {
    return (ll) len * (len + 1) / 2;
}

int main() {
    int n;
    cin >> n;
    string s;
    cin >> s;
    s += "#";
    
    ll ans = 0;
    ll total = cal(n);
    int l = 0;
    for (int r = 1; r <= n; r++) {
        if (s[r] != s[r - 1]) {
            ans += total - cal(l) - cal(n - r);
            l = r;
        }
    }
    cout << ans << endl;
    
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

🌸 05.卢小姐的数组删除计划

質問名

問題の説明

Miss Lu には非常に壮大な計画があり、世界中のすべてのアレイを削除したいと考えています。ただし、彼女の能力は限られており、毎回配列内の 2 つの同一の要素を選択し、それらの間にあるすべての要素 (2 つの要素自体を含む) を削除することしかできません。

さて、ミス・ルーの前には、 んん の配列 ああ1つの、彼女は、この配列内の最大でいくつの要素を削除できるかを知りたいと考えています。

入力フォーマット

最初の行には正の整数が含まれています んん、配列を表します ああ1つの 長さ。

2行目には次の内容が含まれます んん スペースで区切られた正の整数 a 1 、 a 2 、 … 、 a_1、 a_2、 ldots、 a_n1つの1,1つの2,,1つの、配列を表します ああ1つの 要素。

出力フォーマット

Miss Lu が削除できる要素の最大数を示す整数を出力します。

サンプル入力

4
1 2 1 2
  • 1
  • 2

サンプル出力

1
  • 1

データ範囲

  • 1 ≤ n ≤ 2 × 1 0 5 1 ≤ n ≤ 2 倍 10^512×105
  • 1 ≤ ai ≤ 1 0 9 1 ≤ a_i ≤ 10^911つの109

答え

この問題は、ソートとダブル ポインタのアイデアを使用して解決できます。

まず、配列を変換できます ああ1つの の要素は値によって並べ替えられ、配列内の各要素の元の位置が記録されます。この目的は、同じ要素の位置範囲を見つけやすくすることです。

次に、ソートされた配列を反復処理して、要素ごとに、それと同じ値を持つすべての要素の位置範囲を見つけます。 [ 左、右 ] [ 左、右 ][,R] 。この範囲の要素は、元の配列内の 2 つの同一要素の間に位置するため、削除できます。範囲を計算できます [ 左、右 ] [ 左、右 ][,R] の要素の数 R − L − 1 R - L - 1R1、現在の削除要素の最大数と比較し、最大値を更新します。

最後に、削除された要素の最大数を出力します。

時間計算量は O ( n log ⁡ n ) O(n log n)(見よ) 、主に並べ替えの時間の複雑さです。空間の複雑さは、 O(n) は、()、要素の元の位置を保存するために使用されます。

参照コード

  • パイソン
n = int(input())
a = list(map(int, input().split()))

idx = sorted(range(n), key=lambda x: a[x])

ans = 0
i = 0
while i < n:
    j = i
    L, R = n, -1
    while j < n and a[idx[j]] == a[idx[i]]:
        L = min(L, idx[j])
        R = max(R, idx[j])
        j += 1
    ans = max(ans, R - L - 1)
    i = j

print(ans)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • ジャワ
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] a = new int[n];
        Integer[] idx = new Integer[n];

        for (int i = 0; i < n; i++) {
            a[i] = sc.nextInt();
            idx[i] = i;
        }

        Arrays.sort(idx, Comparator.comparingInt(i -> a[i]));

        int ans = 0;
        for (int i = 0; i < n;) {
            int j = i;
            int L = n, R = -1;
            while (j < n && a[idx[j]] == a[idx[i]]) {
                L = Math.min(L, idx[j]);
                R = Math.max(R, idx[j]);
                j++;
            }
            ans = Math.max(ans, R - L - 1);
            i = j;
        }

        System.out.println(ans);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • Cpp
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
    int n;
    cin >> n;
    vector<int> a(n);
    vector<int> idx(n);

    for (int i = 0; i < n; i++) {
        cin >> a[i];
        idx[i] = i;
    }

    sort(idx.begin(), idx.end(), [&](int i, int j) {
        return a[i] < a[j];
    });

    int ans = 0;
    for (int i = 0; i < n;) {
        int j = i;
        int L = n, R = -1;
        while (j < n && a[idx[j]] == a[idx[i]]) {
            L = min(L, idx[j]);
            R = max(R, idx[j]);
            j++;
        }
        ans = max(ans, R - L - 1);
        i = j;
    }

    cout << ans << endl;

    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

最後に書きます

ここでは、上級生向けの秋採用コンパニオン チェックイン キャビンをお勧めします。これは、31 日間で一般的なインターネット筆記試験の問題を解決するためのステップバイステップのガイドです。

🎧 秋招陪伴刷题打卡

  • 試し読み:

【秋採用チェックイン】Day01 - カスタマイズされた並べ替え - CSDN ブログ

【秋採用チェックイン】Day02~最強の二部構成シリーズ~バイナリサーチ~CSDNブログ

【秋採用チェックイン】Day03 - 最強の2点シリーズ - 2点回答 - CSDNブログ

以前の主要メーカーからの実際の質問に関するオンライン レビューを提供しています。興味のある友人は、Qinglong にプライベート メッセージを送信して詳細を確認できます。

ここに画像の説明を挿入します

ここに画像の説明を挿入します

もっともっと!その上!

✈️ 筆記試験問題の包括的な要約

ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します