leetcode 算法题604 (简单154) 迭代压缩字符串

leetcode 算法题604 (简单154) 迭代压缩字符串

  • 题目介绍
对于一个压缩字符串,设计一个数据结构,
它支持如下两种操作: next 和 hasNext。
给定的压缩字符串格式为:
  每个字母后面紧跟一个正整数,这个整数表示该字母在解压后的字符串里连续出现的次数。
  next() - 如果压缩字符串仍然有字母未被解压,则返回下一个字母,否则返回一个空格。
  hasNext() - 判断是否还有字母仍然没被解压。

注意:
  请记得将你的类在 StringIterator 中 初始化 ,
  因为静态变量或类变量在多组测试数据中不会被自动清空。

  • 示例

StringIterator iterator = new StringIterator(“L1e2t1C1o1d1e1”);
iterator.next(); // 返回 ‘L’
iterator.next(); // 返回 ‘e’
iterator.next(); // 返回 ‘e’
iterator.next(); // 返回 ‘t’
iterator.next(); // 返回 ‘C’
iterator.next(); // 返回 ‘o’
iterator.next(); // 返回 ‘d’
iterator.hasNext(); // 返回 true
iterator.next(); // 返回 ‘e’
iterator.hasNext(); // 返回 false
iterator.next(); // 返回 ’ ’

  • 解法一
/**
 * @param {string} compressedString
 */
var StringIterator = function(compressedString) {
  let i = count = 0, number = '', list = [];
  while(i < compressedString.length) {
    if(isNumber(compressedString.charCodeAt(i))) {
      number += compressedString[i];
    } else {
      if(number) {
        list.push(number);
        number = '';
      }
      list.push(compressedString[i]);
    }
    i++;
  }
  if(number) {
    list.push(number);
  }
  this.list = list;
};

const isNumber = code => {
  return code >= 47 && code <= 57;
}

const stringNumberReduc = number => {
  let i = number.length - 1, flag = true, str = '';
  while(i >= 0) {
    if(!flag) {
      str = number[i] + str;
    } else {
      if(i === 0 && flag && number[i] === '1') {
        return str || '0';
      }
      if(number[i] === '0') {
         str = '9' + str;
      } else {
         str = parseInt(number[i]) - 1 + str;
         flag = false;
      }
    }
    i--;
  }
  return str;
}

/**
 * @return {character}
 */
StringIterator.prototype.next = function() {
  let list = this.list;
  if(list.length === 0) {
    return ' ';
  }
  let s = list[0];
  list[1] = stringNumberReduc(list[1]);
  if(list[1] === '0') {
    list.shift();
    list.shift();
  }
  return s;
};


/**
 * @return {boolean}
 */
StringIterator.prototype.hasNext = function() {
    return this.list.length > 0;
};

/** 
 * Your StringIterator object will be instantiated and called as such:
 * var obj = new StringIterator(compressedString)
 * var param_1 = obj.next()
 * var param_2 = obj.hasNext()
 */

执行用时 : 100 ms, 在所有 JavaScript 提交中击败了100.00%的用户

内存消耗 : 38.9 MB, 在所有 JavaScript 提交中击败了100.00%的用户

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值