Guide for El cistell de la compra (2)


Això és una guia per ajudar-te a començar amb aquest problema — no és la solució.
Mostra el codi per a: Consideracions generals Java 11 Python 3

Com abordar aquest problema

Se't donen N productes (nom i preu) i, al final, el nom d'un producte que vols comprovar. Has de dir \ si el tens a la cistella i, si el trobes, dir també quin és l'anterior en ordre alfabètic (si n'hi ha).

Idea general:

  1. Llegeix el nombre N i, a continuació, els N parells (nom, preu).
  2. Guarda'ls en una llista de parelles (nom, preu).
  3. Ordena la llista pel nom del producte, en ordre alfabètic.
  4. Llegeix el nom del producte que es vol comprovar.
  5. Busca'l dins la llista ja ordenada. Si no hi és, escriu "NO N'HI HAVIA".
  6. Si hi és, escriu "SI, M'HA COSTAT " seguit del preu. Si, a més, no és el primer de la llista \ ordenada, afegeix " I TAMBE TINC " amb el nom i el preu del producte immediatament anterior en \ l'ordre alfabètic.

Paranys habituals:

  • Cal ordenar per nom, no pel l'ordre en què s'han llegit els productes.
  • El "producte anterior" ho és en ordre alfabètic un cop ordenada la llista, no l'anterior a l'entrada.
  • Si el producte trobat és el primer en ordre alfabètic, no cal afegir la segona part del missatge.
  • Vigila com formates el preu perquè coincideixi amb com l'has llegit.

Pista per a Java

Guarda els noms i preus en dos arrays paral·lels, ordena un array d'índexs segons el nom, i cerca-hi \ el producte demanat:

import java.util.*;

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

        String[] noms = new String[n];
        double[] preus = new double[n];
        for (int i = 0; i < n; i++) {
            String[] parts = sc.nextLine().trim().split("\\s+");
            noms[i] = parts[0];
            preus[i] = Double.parseDouble(parts[1]);
        }

        Integer[] index = new Integer[n];
        for (int i = 0; i < n; i++) index[i] = i;
        Arrays.sort(index, (a, b) -> noms[a].compareTo(noms[b]));

        String buscat = sc.nextLine().trim();

        int posicio = -1;
        for (int k = 0; k < n; k++) {
            if (noms[index[k]].equals(buscat)) {
                posicio = k;
                break;
            }
        }

        if (posicio == -1) {
            System.out.println("NO N'HI HAVIA");
        } else {
            int i = index[posicio];
            StringBuilder sb = new StringBuilder();
            sb.append("SI, M'HA COSTAT ").append(preus[i]);
            if (posicio > 0) {
                int ant = index[posicio - 1];
                sb.append(" I TAMBE TINC ").append(noms[ant]).append(" A ").append(preus[ant]);
            }
            System.out.println(sb.toString());
        }
    }
}

Tornar al problema