Maximum number of characters using keystrokes A, Ctrl+A, Ctrl+C and Ctrl+V

前端 未结 14 1472
忘掉有多难
忘掉有多难 2020-12-07 07:03

This is an interview question from google. I am not able to solve it by myself. Can somebody shed some light?

Write a program to print the sequence of keystrokes suc

相关标签:
14条回答
  • 2020-12-07 07:36

    Here is my solution with dynamic programming, without a nested loop, and which also prints the actual characters that you'd need to type:

    N = 52
    
    count = [0] * N
    res = [[]] * N
    clipboard = [0] * N
    
    def maybe_update(i, new_count, new_res, new_clipboard):
      if new_count > count[i] or (
          new_count == count[i] and new_clipboard > clipboard[i]):
        count[i] = new_count
        res[i] = new_res
        clipboard[i] = new_clipboard
    
    for i in range(1, N):
      # First option: type 'A'.
      # Using list concatenation for 'res' to avoid O(n^2) string concatenation.
      maybe_update(i, count[i - 1] + 1, res[i - 1] + ['A'], clipboard[i - 1])
    
      # Second option: type 'CTRL+V'.
      maybe_update(i, count[i - 1] + clipboard[i - 1],  res[i - 1] + ['v'],
                   clipboard[i - 1])
    
      # Third option: type 'CTRL+A, CTRL+C, CTRL+V'.
      # Assumption: CTRL+V always appends.
      if i >= 3:
        maybe_update(i, 2 * count[i - 3],  res[i - 3] + ['acv'], count[i - 3])
    
    for i in range(N):
      print '%2d %7d %6d %-52s' % (i, count[i], clipboard[i], ''.join(res[i]))
    

    This is the output ('a' means 'CTRL+A', etc.)

     0       0      0                                                     
     1       1      0 A                                                   
     2       2      0 AA                                                  
     3       3      0 AAA                                                 
     4       4      0 AAAA                                                
     5       5      0 AAAAA                                               
     6       6      3 AAAacv                                              
     7       9      3 AAAacvv                                             
     8      12      3 AAAacvvv                                            
     9      15      3 AAAacvvvv                                           
    10      18      9 AAAacvvacv                                          
    11      27      9 AAAacvvacvv                                         
    12      36      9 AAAacvvacvvv                                        
    13      45      9 AAAacvvacvvvv                                       
    14      54     27 AAAacvvacvvacv                                      
    15      81     27 AAAacvvacvvacvv                                     
    16     108     27 AAAacvvacvvacvvv                                    
    17     135     27 AAAacvvacvvacvvvv                                   
    18     162     81 AAAacvvacvvacvvacv                                  
    19     243     81 AAAacvvacvvacvvacvv                                 
    20     324     81 AAAacvvacvvacvvacvvv                                
    21     405     81 AAAacvvacvvacvvacvvvv                               
    22     486    243 AAAacvvacvvacvvacvvacv                              
    23     729    243 AAAacvvacvvacvvacvvacvv                             
    24     972    243 AAAacvvacvvacvvacvvacvvv                            
    25    1215    243 AAAacvvacvvacvvacvvacvvvv                           
    26    1458    729 AAAacvvacvvacvvacvvacvvacv                          
    27    2187    729 AAAacvvacvvacvvacvvacvvacvv                         
    28    2916    729 AAAacvvacvvacvvacvvacvvacvvv                        
    29    3645    729 AAAacvvacvvacvvacvvacvvacvvvv                       
    30    4374   2187 AAAacvvacvvacvvacvvacvvacvvacv                      
    31    6561   2187 AAAacvvacvvacvvacvvacvvacvvacvv                     
    32    8748   2187 AAAacvvacvvacvvacvvacvvacvvacvvv                    
    33   10935   2187 AAAacvvacvvacvvacvvacvvacvvacvvvv                   
    34   13122   6561 AAAacvvacvvacvvacvvacvvacvvacvvacv                  
    35   19683   6561 AAAacvvacvvacvvacvvacvvacvvacvvacvv                 
    36   26244   6561 AAAacvvacvvacvvacvvacvvacvvacvvacvvv                
    37   32805   6561 AAAacvvacvvacvvacvvacvvacvvacvvacvvvv               
    38   39366  19683 AAAacvvacvvacvvacvvacvvacvvacvvacvvacv              
    39   59049  19683 AAAacvvacvvacvvacvvacvvacvvacvvacvvacvv             
    40   78732  19683 AAAacvvacvvacvvacvvacvvacvvacvvacvvacvvv            
    41   98415  19683 AAAacvvacvvacvvacvvacvvacvvacvvacvvacvvvv           
    42  118098  59049 AAAacvvacvvacvvacvvacvvacvvacvvacvvacvvacv          
    43  177147  59049 AAAacvvacvvacvvacvvacvvacvvacvvacvvacvvacvv         
    44  236196  59049 AAAacvvacvvacvvacvvacvvacvvacvvacvvacvvacvvv        
    45  295245  59049 AAAacvvacvvacvvacvvacvvacvvacvvacvvacvvacvvvv       
    46  354294 177147 AAAacvvacvvacvvacvvacvvacvvacvvacvvacvvacvvacv      
    47  531441 177147 AAAacvvacvvacvvacvvacvvacvvacvvacvvacvvacvvacvv     
    48  708588 177147 AAAacvvacvvacvvacvvacvvacvvacvvacvvacvvacvvacvvv    
    49  885735 177147 AAAacvvacvvacvvacvvacvvacvvacvvacvvacvvacvvacvvvv   
    50 1062882 531441 AAAacvvacvvacvvacvvacvvacvvacvvacvvacvvacvvacvvacv  
    51 1594323 531441 AAAacvvacvvacvvacvvacvvacvvacvvacvvacvvacvvacvvacvv 
    
    0 讨论(0)
  • 2020-12-07 07:37

    Here's how I would approach it:

    • assume CtrlA = select all
    • assume CtrlC = copy selection
    • assume CtrlV = paste copied selection

    given some text, it takes 4 keystrokes to duplicate it:

    • CtrlA to select it all
    • CtrlC to copy it
    • CtrlV to paste (this will paste over the selection - STATE YOUR ASSUMPTIONS)
    • CtrlV to paste again which doubles it.

    From there, you can consider doing 4 or 5 A's, then looping through the above. Note that doing ctrl + a, c, v, v will grow your text exponentially as you loop through. If remaining strokes < 4, just keep doing a CtrlV

    The key to interviews @ places like Google is to state your assumptions, and communicate your thinking. they want to know how you solve problems.

    0 讨论(0)
提交回复
热议问题