Ceci est une question d'entretien de Google. Je ne suis pas capable de le résoudre moi-même. Quelqu'un peut-il faire la lumière?
Écrivez un programme pour imprimer la séquence de frappes de telle sorte qu'il génère le nombre maximum de caractères «A». Vous êtes autorisé à utiliser 4 touches: A, Ctrl+ A, Ctrl+ Cet Ctrl+ V. Seules N frappes sont autorisées. Tous les Ctrlcaractères + sont considérés comme une touche, donc Ctrl+ Aest une touche.
Par exemple, la séquence A, Ctrl+ A, Ctrl+ C, Ctrl+ Vgénère deux A dans 4 frappes.
- Ctrl + A est Sélectionner tout
- Ctrl + C est Copier
- Ctrl + V est Coller
J'ai fait des mathématiques. Pour tout N, en utilisant x nombres de A, un Ctrl+ A, un Ctrl+ Cet y Ctrl+ V, nous pouvons générer max ((N-1) / 2) 2 nombre de A. Pour certains N> M, il vaut mieux utiliser autant de Ctrl+ A, Ctrl+ Cet Ctrl+V séquences comme il double le nombre d'A.
La séquence Ctrl+ A, Ctrl+ V, Ctrl+ Cn'écrasera pas la sélection existante. Il ajoutera la sélection copiée à celle sélectionnée.
^A
faut généralement "sélectionner tout",^C
"copier",^V
"coller". Cela vous donne-t-il une idée?Réponses:
Il existe une solution de programmation dynamique. Nous commençons par savoir que 0 clé peut nous faire 0 A. Ensuite, nous parcourons
i
jusqu'àn
, en faisant deux choses: en appuyant une fois sur A et en appuyant sur sélectionner tout + copier suivi dej
temps de collage (en faitj-i-1
ci-dessous; notez l'astuce ici: le contenu est toujours dans le presse-papiers, nous pouvons donc le coller plusieurs fois sans copie à chaque fois). Nous n'avons qu'à considérer jusqu'à 4 pâtes consécutives, car sélectionner, copier, coller x 5 équivaut à sélectionner, copier, coller, sélectionner, copier, coller et ce dernier est meilleur car il nous en laisse plus dans le presse-papiers. Une fois que nous avons atteintn
, nous avons le résultat souhaité.La complexité peut sembler être O (N), mais comme les nombres croissent à une vitesse exponentielle, il est en fait O (N 2 ) en raison de la complexité de multiplier les grands nombres. Vous trouverez ci-dessous une implémentation Python. Il faut environ 0,5 seconde pour calculer N = 50 000.
Dans le code,
j
représente le nombre total de touches pressées après notre nouvelle séquence de touches. Nous avons déjà desi
touches à ce stade, et 2 nouvelles touches permettent de sélectionner tout et de copier. Par conséquent, nous atteignons desj-i-2
temps de pâte . Puisque le collage ajoute à la séquence existante dedp[i]
A
's, nous devons ajouter la1
créationj-i-1
. Cela explique lej-i-1
dans la 2ème-dernière ligne.Voici quelques résultats (
n
=> nombre de A):Je suis d'accord avec @SB pour dire que vous devriez toujours énoncer vos hypothèses: la mienne est que vous n'avez pas besoin de coller deux fois pour doubler le nombre de caractères. Cela obtient la réponse pour 7, donc à moins que ma solution ne soit fausse, l'hypothèse doit être correcte.
En cas de quelqu'un se demande pourquoi je ne suis pas la vérification des séquences de la forme Ctrl+ A, Ctrl+ C, A, Ctrl+ V: Le résultat final sera toujours le même que celui A, Ctrl+ A, Ctrl+ C, Ctrl+ Vque je ne considère.
la source
n => result
ouresult => n
? De toute façon, je pense que c'est faux. Nous pouvons taper 9 comme avec 7 frappes. Si c'estn => result
vraiment faux. Le nombre de As que vous pouvez taper ne peut pas être inférieur àn
.n => result
. Vous dites "Nous pouvons taper 9 Comme avec 7 frappes", c'est ce que j'obtiens. Lisez le "truc" que je viens den
correspond aux frappes que vous êtes autorisé à utiliser. Vous devez calculer combien de As vous pouvez taper avec desn
touches. Cela7 => 7
n'a donc aucun sens.O(n)
ou mêmeO(1)
:).En utilisant la solution de marcog, j'ai trouvé un modèle qui commence à
n=16
. Pour illustrer cela, voici les frappesn=24
jusqu'àn=29
, j'ai remplacé ^ A par S (sélection), ^ C par C (copie) et ^ V par P (coller) pour plus de lisibilité:Après un premier 4 As, le modèle idéal est de sélectionner, copier, coller, coller, coller et répéter. Cela multipliera le nombre de As par 4 toutes les 5 frappes. Si ce modèle de 5 touches ne peut pas consommer les touches restantes à lui seul, un certain nombre de 4 modèles de touches (SCPP) consomme les dernières frappes, remplaçant SCPPP (ou supprimant l'une des pâtes) si nécessaire. Les 4 modèles de touches multiplient le total par 3 toutes les 4 frappes.
En utilisant ce modèle, voici du code Python qui obtient les mêmes résultats que la solution de marcog, mais est O (1) edit : C'est en fait O (log n) en raison de l'exponentiation, merci à IVlad pour l'avoir signalé.
Calcul de e3: Il y a toujours entre 0 et 4 motifs SCPP à la fin de la liste des touches, car
n % 5 == 4
il y en a 4,n % 5 == 1
il y en a 3,n % 5 == 2
il y en a 2,n % 5 == 3
il y en a 1 etn % 5 == 4
il y en a 0. Cela peut être simplifié à(4 - n) % 5
.Calcul de e4: Le nombre total de motifs augmente de 1 chaque fois
n % 5 == 0
, car il s'avère que ce nombre augmente à exactementn / 5
. En utilisant la division du sol, nous pouvons obtenir le nombre total de motifs, le nombre total poure4
est le nombre total de motifs moinse3
. Pour ceux qui ne connaissent pas Python,//
est la notation à l'épreuve du temps pour la division par étage.la source
n=3000
, donc c'est probablement vrai. (Dommage que je sois hors de votes aujourd'hui: /)O(1)
parce que l'exponentiation ne peut pas être faite en temps constant. C'estO(log n)
.Voici comment je l'aborderais:
étant donné du texte, il faut 4 frappes pour le dupliquer:
À partir de là, vous pouvez envisager de faire 4 ou 5 A, puis de parcourir ce qui précède. Notez que faire
ctrl + a, c, v, v
augmentera votre texte de façon exponentielle au fur et à mesure que vous parcourez. Si les coups restants <4, continuez simplement à faire unCtrlVLa clé des interviews @ endroits comme Google est d'exposer vos hypothèses et de communiquer votre réflexion. ils veulent savoir comment vous résolvez les problèmes.
la source
ACVV-VVVVV
multiplie par 7,ACVV-ACVV-V
multiplie par 6. Donc Ctrl-V pour les coups restants <6 au lieu de 4.Il est résoluble en O (1): Comme pour les nombres de Fibonacci, il existe une formule pour calculer le nombre de A imprimés (et la séquence de frappes):
1) Nous pouvons simplifier la description du problème:
équivaut à
2) Nous pouvons décrire la séquence de frappes comme une chaîne de N caractères parmi {'*', 'V', 'v'}, où 'v' signifie [Cv] et '*' signifie [Ca] et 'V »signifie [Cc]. Exemple: "vvvv * Vvvvv * Vvvv"
La longueur de cette chaîne est toujours égale à N.
Le produit des longueurs des mots Vv dans cette chaîne est égal au nombre de As produits.
3) Étant donné une longueur fixe N pour cette chaîne et un nombre fixe K de mots, le résultat sera maximal si tous les mots ont des longueurs presque égales. Leur différence par paire n'est pas supérieure à ± 1.
Maintenant, quel est le nombre optimal K, si N est donné?
4) Supposons que nous voulions augmenter le nombre de mots en ajoutant un seul mot de longueur L, puis nous devons réduire L + 1 fois tout mot précédent par un «v». Exemple: "… * Vvvv * Vvvv * Vvvv * Vvvv" -> "… * Vvv * Vvv * Vvv * Vvv * Vvv"
Maintenant, quelle est la longueur de mot optimale L?
(5 * 5 * 5 * 5 * 5) <(4 * 4 * 4 * 4 * 4) * 4, (4 * 4 * 4 * 4)> (3 * 3 * 3 * 3) * 3
=> Optimal est L = 4.
5) Supposons que nous ayons un N suffisamment grand pour générer une chaîne avec plusieurs mots de longueur 4, mais il reste quelques frappes; comment les utiliser?
S'il en reste 5 ou plus: ajoutez un autre mot de longueur 4.
S'il reste 0: Terminé.
S'il en reste 4: nous pourrions soit
a) ajoutez un mot de longueur 3: 4 * 4 * 4 * 4 * 3 = 768.
b) ou augmentez de 4 mots jusqu'à 5: 5 * 5 * 5 * 5 = 625. => Ajouter un mot, c'est mieux.
S'il en reste 3: nous pourrions soit
a) ou ajoutez un mot de longueur 3 en ajustant le mot précédent de 4 à 3: 4 * 4 * 4 * 2 = 128 <4 * 4 * 3 * 3 = 144.
b) augmenter de 3 mots jusqu'à 5: 5 * 5 * 5 = 125. => Ajouter un mot, c'est mieux.
S'il en reste 2: nous pourrions soit
a) ou ajoutez un mot de longueur 3 en ajustant les deux mots précédents de 4 à 3: 4 * 4 * 1 = 16 <3 * 3 * 3 = 27.
b) augmenter de 2 mots jusqu'à 5: 5 * 5 = 25. => Ajouter un mot, c'est mieux.
S'il en reste 1: nous pourrions soit
a) ou ajoutez un mot de longueur 3 en ajustant les trois mots précédents de 4 à 3: 4 * 4 * 4 * 0 = 0 <3 * 3 * 3 * 3 = 81.
b) augmentez d'un mot à la longueur 5: 4 * 4 * 5 = 80. => Ajouter un mot, c'est mieux.
6) Maintenant, que se passe-t-il si nous n'avons pas un "N suffisamment grand" pour utiliser les règles de 5)? Nous devons nous en tenir au plan b), si possible! Les chaînes pour petit N sont:
1: "v", 2: "vv", 3: "vvv", 4: "vvvv"
5: "vvvvv" → 5 (plan b)
6: "vvvvvv" → 6 (plan b)
7: "vvv * Vvv" → 9 (plan a)
8: "vvvv * Vvv" → 12 (plan a)
9: "vvvv * Vvvv" → 16
10: "vvvv * Vvvvv" → 20 (plan b)
11: "vvv * Vvv * Vvv" → 29 (plan a)
12: "vvvv * Vvv * Vvv" → 36 (plan a)
13: "vvvv * Vvvv * Vvv" → 48 (plan a)
14: "vvvv * Vvvv * Vvvv" → 64
15: "vvv * Vvv * Vvv * Vvv" → 81 (plan a)
…
7) Maintenant, quel est le nombre optimal K de mots dans une chaîne de longueur N?
Si N <7 alors K = 1 sinon si 6 <N <11 alors K = 2; sinon: K = ceil ((N + 1) / 5)
Écrit en C / C ++ / Java:
int K = (N<7)?(1) : (N<11)?(2) : ((N+5)/5);
Et si N> 10, alors le nombre de mots de longueur 3 sera: K * 5-1-N. Avec cela, nous pouvons calculer le nombre de As imprimés:
Si N> 10, le nombre de As sera: 4 ^ {N + 1-4K} · 3 ^ {5K-N-1}
la source
Utiliser CtrlA+ CtrlC+ CtrlVn'est un avantage qu'après 4 'A'.
Donc je ferais quelque chose comme ça (en pseudo-BASIC-code, puisque vous n'avez spécifié aucun langage approprié):
Éditer
la source
Il faut 3 frappes pour doubler votre nombre d'As. Cela n'a de sens de commencer à doubler que lorsque vous avez déjà imprimé 3 As ou plus. Vous voulez que votre dernière frappe autorisée soit a CtrlVpour vous assurer que vous doublez le plus grand nombre possible, donc afin de l'aligner, nous remplirons toutes les frappes supplémentaires après les trois premiers As au début avec plus de As.
Éditer:
C'est terrible, j'ai complètement pris de l'avance sur moi-même et je n'ai pas envisagé plusieurs pâtes pour chaque copie.
Modifier 2:
Je pense que coller 3 fois est optimal, lorsque vous avez suffisamment de frappes pour le faire. En 5 touches, vous multipliez votre nombre de As par 4. C'est mieux que de multiplier par 3 en utilisant 4 touches et mieux que de multiplier par 5 en utilisant 6 touches. J'ai comparé cela en donnant à chaque méthode le même nombre de frappes, suffisamment pour qu'elles terminent chacune un cycle en même temps (60), laissant le multiplicateur 3 faire 15 cycles, le multiplicateur 4 faire 12 cycles et le 5 multiplicateur fait 10 cycles. 3 ^ 15 = 14 348 907, 4 ^ 12 = 16 777 216 et 5 ^ 10 = 9 765 625. S'il ne reste que 4 frappes, il vaut mieux faire un multiplicateur à 3 que de coller 4 fois de plus, ce qui fait essentiellement du multiplicateur 4 précédent un multiplicateur à 8. S'il ne reste que 3 touches, un multiplicateur à 2 est préférable.
la source
Supposons que vous ayez x caractères dans le presse-papiers et x caractères dans la zone de texte; appelons-le "état x".
Appuyez sur "Coller" plusieurs fois (je le désigne par
m-1
commodité), puis sur "Tout sélectionner" et "Copier"; après cette séquence, nous arrivons à "l'état m * x". Ici, nous avons gaspillé un total de m + 1 frappes. Donc, la croissance asymptotique est (au moins) quelque chose commef^n
, où f =m^(1/(m+1))
. Je crois que c'est la croissance asymptotique maximale possible, même si je ne peux pas (encore) le prouver.Essayer différentes valeurs de m montre que le maximum pour f est obtenu pour
m=4
.Utilisons l'algorithme suivant:
(pas sûr que ce soit le meilleur).
Le nombre de fois pour appuyer sur A au début est de 3: si vous appuyez 4 fois, vous manquez l'occasion de doubler le nombre de A en 3 frappes supplémentaires.
Le nombre de fois pour appuyer sur Coller à la fin n'est pas supérieur à 5: s'il vous reste 6 frappes ou plus, vous pouvez utiliser Coller, Coller, Coller, Sélectionner tout, Copier, Coller à la place.
Donc, nous obtenons l'algorithme suivant:
(pas sûr que ce soit le meilleur). Le nombre de caractères après exécution est quelque chose comme
3 * pow(4, floor((n - 6) / 5)) * (2 + (n - 1) % 5)
.Exemples de valeurs: 1,2,3,4,5,6,9,12,15,18,24,36,48,60,72,96,144,192,240,288, ...
la source
Ce qui suit utilise la deuxième modification du PO selon laquelle le collage ne remplace pas le texte existant.
Remarquez quelques choses:
Chaque séquence de touches raisonnable peut donc être interprétée comme un groupe de Y séparés par des X, par exemple YYYXYXYYXY. Notons V (s) le nombre de 'A' produits par la séquence s. Alors V (nXm) = V (n) * V (m), car X remplace essentiellement tout Y de m par V (n) 'A.
Le problème du copier-coller est donc isomorphe au problème suivant: "en utilisant m + 1 nombres qui totalisent Nm, maximisez leur produit." Par exemple, lorsque N = 6, la réponse est m = 1 et les nombres (2,3). 6 = 2 * 3 = V (YYXYYY) = V (AA ^ A ^ C ^ V ^ V) (ou V (YYYXYY) = V (AAA ^ A ^ C ^ V).)
Nous pouvons faire quelques observations:
Pour une valeur fixe de
m
, les nombres à choisir sontceil( (N-m)/(m+1) )
etfloor( (N-m)/(m+1) )
(quelle que soit la combinaison qui fait que la somme fonctionne; plus précisément, vous aurez besoin(N-m) % (m+1)
ceils
et le restefloor
s). C'est parce que, poura < b
,(a+1)*(b-1) >= a*b
.Malheureusement, je ne vois pas de moyen facile de déterminer la valeur de
m
. Si c'était mon entretien, je proposerais deux solutions à ce stade:Option 1. Boucle sur tout le possible
m
. Unen log n
solution O ( ).Code C ++:
Option 2. Permettre
m
d'atteindre des valeurs non entières et trouver sa valeur optimale en prenant la dérivée de[(N-m)/(m+1)]^m
par rapport àm
et en résolvant sa racine. Il n'y a pas de solution analytique, mais la racine peut être trouvée en utilisant par exemple la méthode de Newton. Ensuite, utilisez le sol et le plafond de cette racine pour la valeur dem
, et choisissez celui qui est le meilleur.la source
la source
Voici mon approche et ma solution avec le code ci-dessous.
Approche:
Il existe trois opérations distinctes qui peuvent être effectuées.
Compte tenu des trois opérations distinctes et de leurs sorties respectives, nous devons parcourir toutes les permutations de ces opérations.
Supposition:
Maintenant, une version de ce problème indique que la séquence de frappes, Ctrl + A -> Ctrl + C -> Ctrl + V, écrase la sélection en surbrillance. Pour prendre en compte cette hypothèse, une seule ligne de code doit être ajoutée à la solution ci-dessous où la variable imprimée dans le cas 2 est définie sur 0
Pour cette solution
Le code ci-dessous imprimera quelques séquences et la dernière séquence est la bonne réponse pour tout N. donné, par exemple pour N = 11, ce sera la séquence correcte
Avec l'hypothèse
A, A, A, A, A, C, S, V, V, V, V,: 20:
Sans l'hypothèse
A, A, A, C, S, V, V, C, S, V, V,: 27:
Légende des touches:
«A» - A
'C' - Ctrl + A
'S' - Ctrl + C
'V' - Ctrl + V
Code:
la source
En utilisant les astuces mentionnées dans les réponses ci-dessus, mathématiquement, la solution peut être expliquée dans une équation comme suit:
4 + 4 ^ [(N-4) / 5] + ((N-4)% 5) * 4 ^ [(N-4) / 5]. où [] est le plus grand facteur entier
la source
Il y a un compromis entre l'impression manuelle des mA, puis l'utilisation de Ctrl+ A, Ctrl+ Cet Nm-2 Ctrl+ V. La meilleure solution est au milieu. Si le nombre maximal de frappes = 10, la meilleure solution consiste à taper 5 A ou 4 A.
essayez d'utiliser ceci Regardez ce http://www.geeksforgeeks.org/how-to-print-maximum-number-of-a-using-given-four-keys/ et optimisez peut-être un peu la recherche des résultats vers le milieu point.
la source
Voici ma solution avec la programmation dynamique, sans boucle imbriquée, et qui imprime également les caractères réels que vous auriez besoin de taper:
Ceci est la sortie ('a' signifie 'CTRL + A', etc.)
la source
Si N coups de touche sont autorisés, alors le résultat est N-3.
A -> N-3
CTRL+ A-> Sélection de ces N caractères: +1
CTRL+ C-> Copie de ces N caractères: +1
Ctrl+ V-> Collage des N caractères. : +1 ie, (Puisque nous avons sélectionné les caractères entiers en utilisant CTRL+ A) En remplaçant ces caractères N-3 existants par les caractères N-3 copiés (qui remplacent les mêmes caractères) et le résultat est N-3.
la source
→
. Cela améliorera la lisibilité de votre réponse!