public class IncrementSybmols {
public static void main(String[] args) throws Throwable {
List<Integer> syms = Arrays.asList(1,2,3,4,5);
test(syms, 3, Arrays.asList(1,2,3), Arrays.asList(1,2,4));
test(syms, 3, Arrays.asList(2,5,4), Arrays.asList(3,1,2));
test(syms, 3, Arrays.asList(4,3,5), Arrays.asList(4,5,1));
test(syms, 3, Arrays.asList(5,4,2), Arrays.asList(5,4,3));
test(syms, 3, Arrays.asList(5,4,3), null);
}
private static void test(List<Integer> syms, int n, List<Integer> in, List<Integer> exp) {
List<Integer> out = increment(syms, n, in);
System.out.println(in+" -> "+out+": "+(exp==out || exp.equals(out)?"OK":"FAIL"));
}
private static List<Integer> increment(List<Integer> allSyms, int n, List<Integer> in){
TreeSet<Integer> availableSym = new TreeSet<Integer>(allSyms);
availableSym.removeAll(in);
LinkedList<Integer> current = new LinkedList<Integer>(in);
// Remove symbols beginning from the tail until a better/greater symbols is available.
while(!current.isEmpty()){
Integer last = current.removeLast();
availableSym.add(last);
// look for greater symbols
Integer next = availableSym.higher(last);
if(next != null){
// if there is a greater symbols, append it
current.add(next);
availableSym.remove(next);
break;
}
}
// if there no greater symbol, then *shrug* there is no greater number
if(current.isEmpty())
return null;
// fill up with smallest symbols again
while(current.size() < n){
Integer next = availableSym.first();
availableSym.remove(next);
current.add(next);
}
return current;
}
}
I buoni intervistatori possono dire se avete una risposta in scatola a queste cose. A loro piace farlo meglio se devi lavorare fuori, perché possono vedere il tuo processo di risoluzione dei problemi, che è più importante della semplice conoscenza della soluzione. – Almo
Ho dato una soluzione come questa, Effettua una coda di doppio fine ordinata di numeri disponibili, inizializza con i numeri disponibili, 1. inizia con cifre di unità, verifica se il numero più alto è disponibile, in caso contrario sostituisci, inserisci questo numero nell'elenco disponibile e controllare la cifra delle decine 2. Nel caso in cui si trovi un numero maggiore della cifra corrente, sostituirlo e iniziare a inserire numeri più piccoli dalla coda. Può essere reso più efficiente e ci sono dei difetti? –
esempio .. {{{ 123 disponibili: 45 controllo 3 .. sostituirlo con 4 per 254 disponibili: 13 controllo 4 .. 1,3 <4 messo 4 in disponibile controllo 5 .. non disponibile Vedi 2 .. disponibile: 1345 inserto 2 disponibile, sostituire con 3, seguito da 1 e 2 }}} –