Condivisione della tecnologia

[Svolta rivoluzionaria nel reclutamento autunnale] Test scritto per il reclutamento autunnale 2024-Domande della prova scritta ByteDance-01-Tre soluzioni di domande linguistiche (Java/Cpp/Python)

2024-07-12

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

🍭 大家好这里是Kiyotaka-senpai , un programmatore che ama gli algoritmi

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

✨ Questa serie prevede di continuare ad aggiornarsi Qiuzhao domande della prova scritta
👏 感谢大家的订阅➕ 和 喜欢💗


📧 清隆这边最近正在收集近一年半互联网笔试题汇总,有需要的小伙伴可以关注 Fine dell'articolo Prendi la crociera della principessa~

Inserisci qui la descrizione dell'immagine

🎀 01.A先生的环形花圃

Descrizione della domanda

Il signor A ha un'aiuola circolare, divisa in non-negligenzaN zona di blocco. Inizialmente, il signor A ha selezionato tre aree dell'aiuola per piantare le rose.

Ora, il signor A vuole utilizzare le operazioni mobili per raggiungere il giardino fioritoStato equilibrato

Stato equilibrato: la distanza tra due aree coltivate a rose non è inferiore a ciaoK(La distanza tra aree adiacenti è 1 1 1)。

Operazione di spostamento: scambia lo stato delle aree adiacenti (l'area rosa diventa area vuota, l'area vuota diventa area rosa).

Allo stesso tempo, il signor A è una persona che presta grande attenzione all'efficienza, quindi spera che tu possa utilizzare il numero minimo di mosse per far sì che l'aiuola raggiunga uno stato equilibrato.

Formato di input

Immettere un numero intero positivo nella prima riga ioT, indicando il numero di richieste.

Prossimo ioT righe, ciascuna riga contiene cinque numeri interi positivi non-negligenzaN ciaoK un 1 un_1UN1 un 2 un_2UN2 un 3 un_3UN3, che rappresentano rispettivamente il numero di aree di aiuola, la distanza minima richiesta e la posizione iniziale delle tre aree di rose.

Formato di output

produzione ioT linee, ciascuna delle quali restituisce un numero intero che rappresenta il numero minimo di scambi richiesti per portare l'aiuola in equilibrio.Se l’equilibrio non può essere raggiunto, produzione − 1 -1 1

Ingresso di esempio

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

Uscita del campione

0
-1
1
  • 1
  • 2
  • 3

intervallo di dati

1 ≤ t ≤ 1 0 4 1 leq t leq 10^41T104
1 ≤ n ≤ 1 0 9 1 leq n leq 10^91N109
1 ≤ k , a 1 , a 2 , a 3 ≤ n 1 quanto k, a_1, a_2, a_3 quanto n1K,UN1,UN2,UN3N

risposta

Questo problema può essere risolto analizzando le condizioni di equilibrio.

Innanzitutto, se la distanza minima richiesta ciaoK Superato il numero di aree giardino non-negligenzaN un terzo di , allora la condizione non può essere soddisfatta, qualunque cosa accada, e in questo momento l'output − 1 -1 1

Altrimenti possiamo prima ordinare le posizioni delle tre aree di rose e poi calcolare la distanza tra le aree di rose adiacenti.Successivamente, per ogni distanza, se è inferiore a ciaoK, allora è richiesta un'operazione di movimento e il numero di movimenti è ciaoK La differenza da questa distanza.

Alla fine, quando tutte le distanze soddisfano i requisiti, l'aiuola raggiunge uno stato equilibrato ed è possibile eseguire il numero totale di movimenti.

La complessità temporale è O(t log ⁡ t) O(t log t)Lo(TIoGT), la complessità dello spazio è L'(1) L'(1)Lo(1)

Codice di riferimento

  • Pitone
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
  • Giava
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.卢小姐的音游金币

Descrizione del problema

La signora Lu è recentemente diventata dipendente da un gioco musicale incentrato sui suoni del pianoforte.Nel gioco, ogni tessera pianoforte ha un numero, dove il numero minimo è 1 1 1 . Se colpisci cinque tessere pianoforte con numeri crescenti in fila, otterrai una moneta d'oro.

Ad esempio, se la signorina Lu colpisce il numero 1, 2, 3, 4, 5, 6 di pezzi per pianoforte, poi per1, 2, 3, 4, 5 Per questi cinque blocchi con numeri crescenti consecutivi, riceverà una moneta d'oro.

Quando si avanza in un livello per un lungo periodo, il numero verrà ripristinato. Il numero di ripristino cambierà da 1 1 1 inizio. Quindi, per un livello, è possibile colpire più tessere di pianoforte con lo stesso numero ma diverse.

Tieni presente che per ottenere monete d'oro sono necessarie solo cinque tessere pianoforte con numeri in continuo aumento nello stesso livello.

Grazie alla forza superiore della signorina Lu, ha superato quattro livelli.Alla signorina Lu ora vengono assegnati quattro livelli di difficoltà aaUN BBB CCC E GGD Numero della tessera pianoforte colpita Quante monete d'oro può ottenere in totale la signora Lu in questi quattro livelli?

Formato di input

La prima riga contiene un numero intero positivo non-negligenzaN 1 ≤ n ≤ 1 0 5 1 leq n leq 10^51N105), che rappresenta il numero totale di tessere pianoforte colpite da Miss Lu nei quattro livelli.

Prossimo non-negligenzaN righe, immettere tre parametri in ciascuna riga: io ioUNioooooooooooo bi biBioooooooooooo 1 ≤ ai , bi ≤ 1 0 9 1 leq a_i, b_i leq 10^91UNioooooooooooo,Bioooooooooooo109)E ci c_iCioooooooooooo ci ∈ { ′ A ′ , ′ B ′ , ′ C ′ , ′ D ′ } c_i in {'A', 'B', 'C', 'D'}Cioooooooooooo{UN,B,C,D}), che rappresentano rispettivamente il numero, la quantità e il livello di ciascuna tessera pianoforte.

Formato di output

Emetti un numero intero che rappresenta il numero totale di monete d'oro che Miss Lu può ottenere.

Ingresso di esempio

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

Uscita del campione

3
  • 1

Descrizione del campione

Per i livelli aaUN,Primo 1, 2, 3, 4, 5 Puoi ottenere una moneta d'oro, e poi2, 3, 4, 5, 6 Puoi ottenere un'altra moneta d'oro.

Per i livelli BBB7, 8, 9, 10, 11 Puoi ottenere una moneta d'oro.

Pertanto, un totale di 3 3 3 monete d'oro.

Ingresso di esempio 2

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

Esempio di output 2

0
  • 1

Descrizione del campione 2

a livello CCC In , non è possibile ottenere cinque numeri crescenti consecutivi, quindi il numero di monete d'oro lo è 0 0 0

intervallo di dati

  • 1 ≤ n ≤ 1 0 5 1 leq n leq 10^51N105
  • 1 ≤ ai , bi ≤ 1 0 9 1 leq a_i, b_i leq 10^91UNioooooooooooo,Bioooooooooooo109
  • ci ∈ { ′ A ′ , ′ B ′ , ′ C ′ , ′ D ′ } c_i in {'A', 'B', 'C', 'D'}Cioooooooooooo{UN,B,C,D}

risposta

Questo problema può essere risolto utilizzando tabelle hash e ordinamento. Le idee specifiche sono le seguenti:

  1. Utilizza la tabella hash cnt Registra il numero di volte in cui ciascun numero appare in ciascun livello. La chiave è la combinazione del carattere del livello e del numero, mentre il valore è il numero di volte in cui il numero appare nel livello.

  2. Ordinare i dati di input in base ai caratteri e ai numeri del livello per garantire che i numeri dello stesso livello siano consecutivi.

  3. Attraversa i dati ordinati e, per ciascun numero, determina se i suoi cinque numeri consecutivi esistono tutti nel livello corrente. Se esiste, prendi il valore minimo del numero di occorrenze tra questi cinque numeri, contalo nella risposta e sottrai il valore minimo dal numero di occorrenze di questi cinque numeri.

  4. La risposta finale è la somma di tutte le monete d'oro che soddisfano le condizioni.

La complessità temporale è O ( n log ⁡ n ) O(n log n)Lo(NIoGN), la complessità dello spazio è O (n) O (n)Lo(N)

Codice di riferimento

  • Pitone
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
  • Giava
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. Il giardino unico di Miss Lu

Descrizione del problema

La signorina Lu ha una lunghezza di non-negligenzaN in un giardino piantumato con non-negligenzaN Pianta fiori diversi.Ogni fiore ha un valore di bellezza io ioUNioooooooooooo

La signora Lu ritiene che un bel giardino dovrebbe essere unico, cioè lo è n − 1 n-1N1 Il valore di bellezza dei fiori piantati è lo stesso, solo 1 1 1 Il valore di bellezza dei fiori piantati è diverso da quello degli altri fiori.

Per ogni operazione, Miss Lu può scegliere un fiore e aumentarne il valore di bellezza. 1 1 1 o meno 1 1 1

Ora la signora Lu vuole sapere quante operazioni sono necessarie per rendere unico il giardino.

Formato di input

La prima riga contiene un numero intero positivo non-negligenzaN, indicante la lunghezza del giardino.

La seconda riga contiene non-negligenzaN intero positivo un 1 , un 2 , … , un a_1, a_2, ldots, unUN1,UN2,,UNN, indicando il valore di bellezza di ciascun fiore.

Formato di output

Restituisce un numero intero che rappresenta il numero minimo di operazioni richieste per rendere unico il giardino.

Ingresso di esempio

4
1 2 3 4
  • 1
  • 2

Uscita del campione

2
  • 1

intervallo di dati

  • 1 ≤ n ≤ 1 0 5 1 leq n leq 10^51N105
  • 1 ≤ ai ≤ 1 0 9 1 leq a_i leq 10^91UNioooooooooooo109

risposta

La soluzione ottimale è diventare la mediana ed enumerare tutti i costi necessari per diventare tale.

La complessità temporale è O ( n log ⁡ n ) O(n log n)Lo(NIoGN), la complessità dello spazio è O (n) O (n)Lo(N)

Codice di riferimento

  • Pitone
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
  • Giava
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的字符画

Descrizione della domanda

LYA è recentemente diventata ossessionata dalla pittura dei personaggi. Crede che la bellezza di un dipinto dei personaggi sia uguale al numero di simboli identici consecutivi nel dipinto dei personaggi.Ad esempio, l'estetica del dipinto del personaggio "aabbccddef" lo è 6 6 6

L'amica di LYA le ha dato un 0 0 0 E 1 1 1 LYA, che è diventata ossessionata dal disegno dei personaggi, vuole conoscere tutte le stringhe composte da questa stringa.sottostringaQual è la somma dell'estetica?

Nota: ci sono C n + 1 2 C^{2}_{n+1}CN+12 sottostringa.

Formato di input

Immettere un numero intero positivo nella prima riga non-negligenzaN, che indica la lunghezza della corda.

La lunghezza della seconda riga è non-negligenzaN Di 01 01 01 Corda.

Formato di output

Restituisce un numero intero che rappresenta la somma dell'estetica di tutte le sottostringhe.

Ingresso di esempio

4
0011
  • 1
  • 2

Uscita del campione

14
  • 1

intervallo di dati

1 ≤ n ≤ 2 × 1 0 5 1 leq n leq 2 volte 10^51N2×105

risposta

Questo problema può essere risolto attraverso l'idea della somma del prefisso.

Per prima cosa possiamo calcolare il numero totale di sottostringhe della stringa n ( n + 1 ) 2 frazione {n(n+1)}{2}2N(N+1)

Quindi, iteriamo sulla stringa e utilizziamo le variabili LLl Registra la posizione iniziale degli attuali simboli identici consecutivi, variabile rrR Registra la posizione corrente.Quando s [ r ] ≠ s [ r − 1 ] s[r] neq s[r-1]S[R]=S[R1] Quando , significa che appare un nuovo simbolo e possiamo calcolare [ l , r ) [ l , r )[l,R) Cioè il numero di sottostringhe nell'intervallo ( r − l ) ( r − l + 1 ) 2 frazioni {(rl)(r-l+1)}{2}2(Rl)(Rl+1), sottrailo dal numero totale di sottostringhe.

Infine, ciò che rimane è il numero di tutte le sottostringhe belle che possono essere emesse.

complessità temporale O (n) O (n)Lo(N), complessità spaziale L'(1) L'(1)Lo(1)

Codice di riferimento

  • Pitone
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
  • Giava
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.卢小姐的数组删除计划

Nome della domanda

Descrizione del problema

La signorina Lu ha un piano davvero grandioso: vuole eliminare tutti gli array del mondo! Ma la sua capacità è limitata. Può selezionare ogni volta solo due elementi identici nell'array ed eliminare tutti gli elementi tra di loro (compresi i due elementi stessi).

Ora, di fronte alla signorina Lu, c'è una lunghezza di non-negligenzaN serie di aaUN, vuole sapere quanti elementi in questo array può eliminare al massimo.

Formato di input

La prima riga contiene un numero intero positivo non-negligenzaN, rappresenta una matrice aaUN lunghezza.

La seconda riga contiene non-negligenzaN interi positivi separati da spazi un 1 , un 2 , … , un a_1, a_2, ldots, unUN1,UN2,,UNN, rappresenta una matrice aaUN Elementi.

Formato di output

Emette un numero intero, che indica il numero massimo di elementi che Miss Lu può eliminare.

Ingresso di esempio

4
1 2 1 2
  • 1
  • 2

Uscita del campione

1
  • 1

intervallo di dati

  • 1 ≤ n ≤ 2 × 1 0 5 1 leq n leq 2 volte 10^51N2×105
  • 1 ≤ ai ≤ 1 0 9 1 leq a_i leq 10^91UNioooooooooooo109

risposta

Questo problema può essere risolto utilizzando le idee dell'ordinamento e dei doppi puntatori.

Per prima cosa possiamo convertire l'array aaUN Gli elementi sono ordinati per valore e viene registrata la posizione originale di ciascun elemento nell'array. Lo scopo di questo è facilitarci nel trovare l'intervallo di posizione dello stesso elemento.

Successivamente, possiamo scorrere l'array ordinato e, per ciascun elemento, trovare l'intervallo di posizione di tutti gli elementi che hanno il suo stesso valore [ S , D ] [ S , D ][L,R] . Gli elementi in questo intervallo possono essere eliminati perché si trovano tra due elementi identici nell'array originale.Possiamo calcolare l'intervallo [ S , D ] [ S , D ][L,R] Il numero di elementi in R − L − 1 R - L - 1RL1, confrontalo con il numero massimo corrente di elementi eliminati e aggiorna il valore massimo.

Infine, genera il numero massimo di elementi eliminati.

La complessità temporale è O ( n log ⁡ n ) O(n log n)Lo(NIoGN) , principalmente la complessità temporale dell'ordinamento.La complessità dello spazio è O (n) O (n)Lo(N), utilizzato per memorizzare la posizione originale dell'elemento.

Codice di riferimento

  • Pitone
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
  • Giava
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

scrivi alla fine

Qui vorrei consigliarti la cabina check-in per il reclutamento autunnale degli anziani. Ti aiuterà passo dopo passo a risolvere le domande più comuni delle prove scritte su Internet in 31 giorni. Ogni giorno è pieno di informazioni utili.

🎧 秋招陪伴刷题打卡

  • Lettura di prova:

[Check-in del reclutamento autunnale] Day01-Ordinamento personalizzato-CSDN Blog

[Check-in per il reclutamento autunnale] Day02-La serie in due sezioni più forte-Ricerca binaria-Blog CSDN

[Check-in per il reclutamento autunnale] Giorno 03-La serie in due punti più forte-Risposta in due punti-Blog CSDN

Forniamo recensioni online di domande reali dei principali produttori precedenti. Gli amici interessati possono inviare un messaggio privato a Qinglong per saperne di più.

Inserisci qui la descrizione dell'immagine

Inserisci qui la descrizione dell'immagine

E altro ancora! Oltretutto!

✈️ Un riepilogo completo delle domande della prova scritta

Inserisci qui la descrizione dell'immagine
Inserisci qui la descrizione dell'immagine
Inserisci qui la descrizione dell'immagine