443. 压缩字符串

给定一组字符,使用原地算法将其压缩。
压缩后的长度必须始终小于或等于原数组长度。
数组的每个元素应该是长度为1 的字符(不是 int 整数类型)。
在完成原地修改输入数组后,返回数组的新长度。

示例 1:
输入:["a","a","b","b","c","c","c"]
输出:返回6,输入数组的前6个字符应该是:["a","2","b","2","c","3"]
说明:
"aa"被"a2"替代。"bb"被"b2"替代。"ccc"被"c3"替代。


思路:
遍历list:
如果下一个元素和当前元素一样,ans不变,计数器加一;
如果下一个元素和当前元素不一样,将ans和计数器转型后拼接到结果串后面;
然后 ans重置,计数器重置;

  1 class Solution(object):
  2     def compress3(self, chars):
  3         # 设定记录元素的指针 和 写指针
  4         anchor = write = 0
  5         # 遍历原list
  6         for read, c in enumerate(chars):
  7             # 如果读到了原list末尾,或者当前字符与后一个字符不同,说明读到了相同字符的末尾
  8             if read + 1 == len(chars) or chars[read + 1] != c:
  9                 # 将记录的元素写到新list中
 10                 chars[write] = chars[anchor]
 11                 # 写指针后移
 12                 write += 1
 13                 # 如果读指针比记录指针走得远
 14                 if read > anchor:
 15                     # 将计数器字符化并拼接到新list后
 16                     for digit in str(read - anchor + 1):
 17                         chars[write] = digit
 18                         write += 1
 19                 # 记录指针赋新值
 20                 anchor = read + 1
 21         res = [0]*write
 22         for k in range(write):
 23             if k<write:
 24                 res[k] = chars[k]
 25         print(res)
 26         # 返回写指针的位置,即是新list的长度
 27         return write
 28 
 29     def compress2(self, chars):
 30         """
 31         :type chars: List[str]
 32         :rtype: int
 33         """
 34         # 写指针
 35         ans = 0
 36         # 记录指针
 37         index = 0
 38         # 遍历原list
 39         for i, ch in enumerate(chars):
 40             # 要是遍历到了list的最后或者当前字符与下一个字符不同,则相同字符读取结束
 41             if i == len(chars) - 1 or chars[i + 1] != ch:
 42                 # 将记录指针指向的元素赋给新list
 43                 chars[ans] = chars[index]
 44                 # 写指针后移
 45                 ans += 1
 46                 # 要是读指针走在记录指针的前面
 47                 if i > index:
 48                     # 计算相同字符的长度
 49                     length = i - index + 1
 50                     for j in str(length):
 51                         chars[ans] = j
 52                         ans += 1
 53                 index = i + 1
 54         result = [0] * ans
 55         for k in range(ans):
 56             if k < ans:
 57                 result[k] = chars[k]
 58         print(result)
 59         return ans
 60 
 61     """
 62     将整数index按位拼接到集合后面
 63     """
 64 
 65     def intToList(self, result, index):
 66         """
 67         :type result: List[str]
 68         :type index: int
 69         :rtype: List[str]
 70         """
 71         temp = str(index)
 72         for i in range(len(temp)):
 73             result.append(temp[i])
 74         return result
 75 
 76     def compress(self, chars):
 77         """
 78         :type chars: List[str]
 79         :rtype: int
 80         """
 81         print("集合的长度:", len(chars))
 82         # 计数器初始化
 83         index = 1
 84         # 结果list的长度
 85         listLen = 1
 86         for i in range(1, len(chars)):
 87             # print(chars[i])
 88             if chars[i] == chars[i - 1]:
 89                 index += 1
 90             elif chars[i] != chars[i - 1]:
 91                 chars[listLen] = str(index)
 92                 listLen += 1
 93                 chars[listLen] = chars[i]
 94                 listLen += 1
 95                 index = 1
 96         print(chars)
 97         return listLen
 98 
 99 
100 if __name__ == '__main__':
101     solution = Solution()
102     print(solution.compress2(["a"]))
103     print(solution.compress2(["a", "a", "b", "b", "c", "c", "c"]))
104     print(solution.compress2(["a", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b"]))

 

 
posted @ 2020-04-11 20:56  人间烟火地三鲜  阅读(208)  评论(0编辑  收藏  举报