面试题 01.06. 字符串压缩

题意: 压缩字符串,如:“aabbccc"压缩为"a2b2c3”,如果压缩后的字符串长度大于等于原字符串,则返回原来的字符串。

解法(双指针法)
思路:

  • 建立p1,p2双指针:p1指向同字符子串的头部,p2用来扫描原字符串,找子串尾部
  • p1与p2之间的子串即为同字符子串,p2-p1为子串长度
  • 把p1指向的字符和子串长度追加到StringBuffer中
  • 最后判断以下StringBuffer和原字符串长度
class Solution {public String compressString(String S) {// p1指向字符重复子串的头部int p1 = 0;// p2扫描出字符重复子串的范围int p2 = 0;StringBuffer buffer = new StringBuffer();while (p2 < S.length()) {while (p2 < S.length() && S.charAt(p1) == S.charAt(p2)) p2++;buffer.append(S.charAt(p1)).append(p2 - p1);p1 = p2;}if(buffer.length() >= S.length()) {return S;} else return buffer.toString();}
}

优化
思路: 遍历字符串时把字符串转为char[] c = S.toCharArray(),再遍历char数组效率更高,通过s.charAt(i)方法索引多了方法栈和越界检查的消耗

class Solution {public String compressString(String S) {// p1指向字符重复子串的头部int p1 = 0;// p2扫描出字符重复子串的范围int p2 = 0;StringBuffer buffer = new StringBuffer();char[] str = S.toCharArray();while (p2 < str.length) {while (p2 < str.length && str[p1] == str[p2]) p2++;buffer.append(str[p1]).append(p2 - p1);p1 = p2;}return buffer.length() >= S.length() ? S : buffer.toString();}
}

收获:

  • p1指向子串头部,p2指向尾部后一位,则p2-p1即为子串长度

  • 以后要遍历字符串的时候尽量把字符串转为字符数组,效率要快一倍

  • 以后把if ... else ... 语句替换成三目运算符? :逼格更高,大佬们都这么做的

LeetCode 面试题 01.06. 字符串压缩 (双指针)相关推荐

  1. Leetcode 面试题 01.06.字符串压缩(Compress String LCCI)

    Leetcode 面试题 01.06.字符串压缩 1 题目描述(Leetcode题目链接)   字符串压缩.利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能.比如,字符串aabccccc ...

  2. Leetcode:面试题 01.06. 字符串压缩

    题目: 字符串压缩.利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能.比如,字符串aabcccccaaa会变为a2b1c5a3.若"压缩"后的字符串没有变短,则返回原 ...

  3. 程序员面试金典 - 面试题 01.06. 字符串压缩(字符串)

    1. 题目 字符串压缩.利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能.比如,字符串aabcccccaaa会变为a2b1c5a3.若"压缩"后的字符串没有变短,则返 ...

  4. 面试题 01.06. 字符串压缩

    2020-03-16 1.题目描述 字符串压缩 2.解题思路 用一个字符变量c存放第一个不同的字符,然后遍历其后面的字符,如果相同则cnt加一,否则更新c 以及cnt,注意这里的cnt是可能大于10的 ...

  5. 程序员面试金典面试题 01.06. 字符串压缩

    前言 本系列文章为<程序员面试金典>刷题笔记. 题目位置:字符串压缩 题集:程序员面试金典 题目 字符串压缩.利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能.比如,字符串a ...

  6. 文巾解题 面试题 01.06. 字符串压缩

    1 题目描述 2 解题思路 也很简单,从头到尾遍历一遍即可,先建立一个表示出现次数的字符串tmp,然后返回tmp和S中短的那个 时间复杂度 O(n),空间复杂度O(n) class Solution: ...

  7. leetcode每日一题--前缀树;前缀哈希;深搜;面试题 08.04. 幂集;648. 单词替换面试题 01.09. 字符串轮转;剑指 Offer II 062. 实现前缀树

    leetcode每日一题 ps:今天的每日一题没意思,简单的模拟,自己换一道 面试题 08.04. 幂集 幂集.编写一种方法,返回某集合的所有子集.集合中不包含重复的元素. 说明:解集不能包含重复的子 ...

  8. 面试题 01.09. 字符串轮转

    面试题 01.09. 字符串轮转 字符串轮转.给定两个字符串s1和s2,请编写代码检查s2是否为s1旋转而成(比如,waterbottle是erbottlewat旋转后的字符串). 示例1: 输入:s ...

  9. LeetCode 面试题 03.06. 动物收容所

    文章目录 一.题目 1.题目描述 2.基础框架 3.原题链接 二.解题报告 1.思路分析 2.时间复杂度 3.代码详解 1)队列的增删改查 2)源码 三.本题小知识 四.加群须知 一.题目 1.题目描 ...

最新文章

  1. 任天堂遭史上最严重黑客攻击:完整源代码、设计文档及技术演示泄露
  2. 数据统计之月增用户统计
  3. python语言流程控制语句的格式_Python流程控制语句的深入讲解
  4. [导入]用Javascript实现interface的类似功能
  5. Leecode240. 搜索二维矩阵 II——Leecode每日一题系列
  6. js 月份加6个月_美国切削工具6月份订单较上月增加10.1
  7. 【NOI2019】回家路线【无后效性dp状态设计】【斜率优化】
  8. [剑指offer][JAVA]面试题第[14-1、2]题[剪绳子][Leetcode][第343题][整数拆分][数学][动态规划][背包]
  9. kafka php 教程,php的kafka踩坑(一)
  10. 1.3编程基础之算术表达式与顺序执行 19 AXB问题
  11. 应用重连时间_App Store 无法正常下载应用,一直转圈的处理办法
  12. python调用java方法_python调用Java方法传入HashMap ArrayList
  13. 【爬虫剑谱】一卷2章 软件篇-EdgeDriver的安装及配置
  14. 携程回应突发故障:「bug已修复」;罗永浩再嘲iPhone11浴霸相机;React 16.10.0发布|极客头条...
  15. 1000套微信小程序源码模板分享下载,各种类型任意选择
  16. 汽车零部件行业需求分析及解决方案
  17. 电脑字母下标数字怎么打java_下标小字母大全 一个字母的右下标怎么用电脑打...
  18. Nvidia Jetson AGX Xavier 安装SATA接口固态硬盘
  19. Zend Studio 10.6.0正式版注册破解
  20. 以空间换时间——动态规划算法及其应用:矩阵链相乘

热门文章

  1. [UE4]函数和事件的区别
  2. textBox的Key_Down事件
  3. 20151209小问题
  4. 计蒜之道2015程序设计大赛初赛第三场——腾讯手机地图
  5. 浅谈.net事件机制
  6. Linux服务器之间传输文件 scp命令
  7. jq使用教程01_最贴心教程,安装JQData全靠这篇指南
  8. 读书笔记_量化交易如何建立自己的算法交易04
  9. ubuntu18下pyspider的安装
  10. 2021年最值得推荐的七款可视化工具,人人都能学会使用