作者: 负雪明烛
id: fuxuemingzhu
个人博客: http://fuxuemingzhu.cn/


题目地址:https://leetcode.com/problems/string-compression/description/

题目描述

Given an array of characters, compress it in-place.

The length after compression must always be smaller than or equal to the original array.

Every element of the array should be a character (not int) of length 1.

After you are done modifying the input array in-place, return the new length of the array.

Follow up:
Could you solve it using only O(1) extra space?

Example 1:

Input:
["a","a","b","b","c","c","c"] Output:
Return 6, and the first 6 characters of the input array should be: ["a","2","b","2","c","3"] Explanation:
"aa" is replaced by "a2". "bb" is replaced by "b2". "ccc" is replaced by "c3".

Example 2:

Input:
["a"] Output:
Return 1, and the first 1 characters of the input array should be: ["a"] Explanation:
Nothing is replaced.

Example 3:

Input:
["a","b","b","b","b","b","b","b","b","b","b","b","b"] Output:
Return 4, and the first 4 characters of the input array should be: ["a","b","1","2"]. Explanation:
Since the character "a" does not repeat, it is not compressed. "bbbbbbbbbbbb" is replaced by "b12".
Notice each digit has it's own entry in the array.

Note:

  1. All characters have an ASCII value in [35, 126].
  2. 1 <= len(chars) <= 1000.

题目大意

统计每个字符出现的次数,然后放到原地,需要按照顺序放。完成了字符串的压缩。

解题方法

使用额外空间

自己的方法比较简单粗暴,用了额外的空间来保存了所有的数字出现的次数,最后再放回到chars上。

class Solution(object):
def compress(self, chars):
"""
:type chars: List[str]
:rtype: int
"""
marks = ""
length = -1
cur = chars[0]
for i, value in enumerate(chars):
length += 1
if value != cur:
count = str(length) if length != 1 else ''
marks += cur + count
cur = value
length = 0
if i == len(chars) - 1:
length += 1
count = str(length) if length != 1 else ''
marks += cur + count
cur = value
length = 0
print marks
for i, mark in enumerate(marks):
chars[i] = mark
return len(marks)

不使用额外空间

保存一个pos位置,告诉我们当前需要放在哪个地方。然后我们统计连续的字符出现了多少次,如果大于1次才往后拼接上去。

class Solution(object):
def compress(self, chars):
"""
:type chars: List[str]
:rtype: int
"""
pre = chars[0]
count = 0
pos = 0
for ch in chars:
if pre == ch:
count += 1
else:
chars[pos] = pre
pos += 1
if count > 1:
count = str(count)
for i in range(len(count)):
chars[pos] = count[i]
pos += 1
count = 1
pre = ch
chars[pos] = pre
pos += 1
if count > 1:
count = str(count)
for i in range(len(count)):
chars[pos] = count[i]
pos += 1
return pos

日期

2018 年 1 月 27 日
2018 年 11 月 24 日 —— 周六快乐

最新文章

  1. Unity3D热更新全书-脚本(三) C#LightEvil语法与调试
  2. Linux GDB Debugging
  3. 菜鸟学Linux命令:tar命令 压缩与解压缩
  4. 诊断SQLSERVER问题常用的日志
  5. ios照片获取,拍照功能
  6. 采用PHP函数uniqid生成一个唯一的ID
  7. 随机提取N条记录[多种数据库方法]
  8. HDU 1203 I NEED A OFFER!(dp)
  9. OpenCV成长之路:图像直方图
  10. 记一次企业级爬虫系统升级改造(五):基于JieBaNet+Lucene.Net实现全文搜索
  11. 在vi或者vim中显示行号
  12. babel入门基础
  13. php表单提交--文件
  14. sed命令详解 vim高级技巧 shell编程上
  15. Flask 学习 六 大型程序结构
  16. vim 初识
  17. [原]Docker部署SuperMap8.1.1
  18. pgm15
  19. Hadoop Mapreduce 案例 wordcount+统计手机流量使用情况
  20. 服务器webapi集成极光推送学习笔记

热门文章

  1. MAC——解决问题:打不开,因为它来自身份不明的开发者
  2. 蛋白组DIA分析:Spectronaut软件使用指南
  3. URI和URL的区别(转)
  4. a.out的由来
  5. Python基础之字符串类型内置方法
  6. rsync实现windows和windows之间的数据同步
  7. makefile高级用法
  8. CMakeLists.txt添加多个源代码
  9. Express中间件原理详解
  10. ORACLE 加大日志文件