leetcode 394.字符串解码 Java

Posted metatreasure

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode 394.字符串解码 Java相关的知识,希望对你有一定的参考价值。

394.字符串解码

给定一个经过编码的字符串,返回它解码后的字符串。

编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。

你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。

此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a2[4] 的输入。

示例 1:

输入:s = "3[a]2[bc]"
输出:"aaabcbc"

示例 2:

输入:s = "3[a2[c]]"
输出:"accaccacc"

示例 3:

输入:s = "2[abc]3[cd]ef"
输出:"abcabccdcdcdef"

示例 4:

输入:s = "abc3[cd]xyz"
输出:"abccdcdcdxyz"

提示:

  • 1 <= s.length <= 30
  • s 由小写英文字母、数字和方括号 \'[]\' 组成
  • s 保证是一个 有效 的输入。
  • s 中所有整数的取值范围为 [1, 300]
public String decodeString(String s)
  Deque<Character> stack = new ArrayDeque<>();
  for(char c :s.toCharArray())
    if(c != \']\')
      stack.push(c);   //把除了\']\'的所有都押入到栈中
    else
      StringBuilder sb = new StringBuilder();
      while(!stack.isEmpty()&& Character.isLetter(stack.peek()))
        sb.insert(0,stack.pop());
      
      String sub = sb.toString(); // 获得 [] 内的字符串
      stack.pop(); // 去除 [ 括号
      
      // step2 :获取倍数数字
      sb = new StringBuilder();
 			while(!stack.isEmpty() && Character.isDigit(stack.peek()))
        sb.insert(0,stack.pop());
           
      int count = Integer.valueOf(sb.toString()); // 倍数
      
      while(count > 0)
        for(char ch:sub.toCharArray)
          stack.push(ch);
        
      	count--;
      
    
  
  // 把栈里面所有的字母取出来
  StringBuilder retv = new StringBuilder();
  while(!stack.isEmpty())
    retv.insert(0,stack.pop());
  
  return retv.toString();

Bulb Switcher (leetcode java)

问题描述:

There are n bulbs that are initially off. You first turn on all the bulbs. Then, you turn off every second bulb. On the third round, you toggle every third bulb (turning on if it‘s off or turning off if it‘s on). For the nth round, you only toggle the last bulb. Find how many bulbs are on after n rounds.

问题分析:

/**
 * 
 * There are n bulbs that are initially off. 
 * You first turn on all the bulbs. 
 * Then, you turn off every second bulb. 
 * On the third round, you toggle every third bulb (turning on if it‘s off or turning off if it‘s on). 
 * For the nth round, you only toggle the last bulb. Find how many bulbs are on after n rounds.
 * 
 * 一、从给定的题目中找到规律:就是,当 i 为  1 到 n之间的任何数时,翻转 k = ri 位置上灯泡的状态。
 * 求n轮之后,还有几盏灯是开着的?
 * 二、最直观的方法是穷举法:一轮轮的遍历,但是,当n很大时,时间复杂度太大。
 * 三、找规律:
 * 若起初有5盏灯,经过5轮翻转后,最终只有第1盏和第4盏是亮着的,不妨分析下,这里面是否有什么规律?
 * 起始:5盏灯全部为 off
 * 1 = (1,1)                                       1次翻转,最终on
 * 2 = (1,2),(2,1)                      2次翻转,最终off
 * 3 = (1,3),(3,1)                      2次翻转,最终off
 * 4 = (1,4),(2,2),(4,1)    3次翻转,最终on
 * 5 = (1,5),(5,1)                      2次翻转,最终off
 * 
 * 可以看出,最终为on的灯所在位置都是平方数
 * @author admin
 *
 */

代码:1到n之间 平方数的个数 为: sqrt(n) 向下取整

//返回n轮之后,有多少盏灯是开着的
    public static int bulbSwitch(int n){
        if(n <= 0)
            return 0;
        int num = (int)Math.sqrt(n); //求n的平方根,double强制转换为int类型,即为向下取整。
        
        System.out.println(num);
        
        return num;
    }

 

以上是关于leetcode 394.字符串解码 Java的主要内容,如果未能解决你的问题,请参考以下文章

leetcode 394. 字符串解码 java

LeetCode 394. 字符串解码

LeetCode 394. 字符串解码

LeetCode Java刷题笔记—394. 字符串解码

[JavaScript 刷题] 栈 - 字符串解码, leetcode 394

leetcode 394 字符串解码.