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

题目:

https://leetcode-cn.com/problems/compress-string-lcci/

字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串。你可以假设字符串中只包含大小写英文字母(a至z)。

示例1:

输入:"aabcccccaaa"
输出:"a2b1c5a3"
示例2:

输入:"abbccd"
输出:"abbccd"
解释:"abbccd"压缩后为"a1b2c2d1",比原字符串长度更长。
提示:

字符串长度在[0, 50000]范围内。

分析:

先得到压缩后的字符串,再比较长度返回短的即可。

程序:

class Solution {
    public String compressString(String S) {
        if(S.length() == 0)
            return S;
        int times = 0;
        StringBuilder str = new StringBuilder();
        char ch = S.charAt(0);
        for(int i = 0; i < S.length(); ++i){
            if(S.charAt(i) == ch){
                times++;
            }else{
                str.append(ch);
                str.append(times);
                times = 1;
                ch = S.charAt(i);
            }
        }
        str.append(ch);
        str.append(times);
        String res = str.toString();
        return res.length() < S.length() ? res : S;
    }
}

原文地址:https://www.cnblogs.com/silentteller/p/12390139.html

时间: 2024-10-04 17:45:03

程序员面试金典-面试题 01.06. 字符串压缩的相关文章

程序员面试金典-面试题 01.01. 判定字符是否唯一

题目: https://leetcode-cn.com/problems/is-unique-lcci/ 实现一个算法,确定一个字符串 s 的所有字符是否全都不同. 示例 1: 输入: s = "leetcode"输出: false 示例 2: 输入: s = "abc"输出: true限制: 0 <= len(s) <= 100如果你不使用额外的数据结构,会很加分. 分析: 哈希做法,开辟数组,统计对应位置的字符出现数量,遍历字符串,当数量为1时,表示

程序员面试金典-面试题 02.04. 分割链表

题目: 编写程序以 x 为基准分割链表,使得所有小于 x 的节点排在大于或等于 x 的节点之前.如果链表中包含 x,x 只需出现在小于 x 的元素之后(如下所示).分割元素 x 只需处于“右半部分”即可,其不需要被置于左右两部分之间. 示例: 输入: head = 3->5->8->5->10->2->1, x = 5输出: 3->1->2->10->5->5->8 分析: 可以新建两个链表存储小于x的节点和大于等于x的节点,然后再将

程序员面试金典-面试题 04.02. 最小高度树

题目: 给定一个有序整数数组,元素各不相同且按升序排列,编写一个算法,创建一棵高度最小的二叉搜索树. 示例:给定有序数组: [-10,-3,0,5,9], 一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树: 0 / \ -3   9 /     / -10  5 分析: 因为数组中元素已经有序,我们可以将数组中最中间的元素作为根节点,然后递归构建二分搜索树,当前结点的左子树由中间元素左边的的元素构成,右子树则由右边元素,递归构建即可. 程序: /**

程序员面试金典-面试题 04.05. 合法二叉搜索树

题目: https://leetcode-cn.com/problems/legal-binary-search-tree-lcci/ 实现一个函数,检查一棵二叉树是否为二叉搜索树. 示例 1:输入: 2 / \ 1 3输出: true示例 2:输入: 5 / \ 1 4  / \  3 6输出: false解释: 输入为: [5,1,4,null,null,3,6].  根节点的值为 5 ,但是其右子节点值为 4 . 分析: 两种做法,利用二分搜索树中序遍历的性质,节点val值的顺序应该是严格

程序员面试金典-面试题 16.05. 阶乘尾数

题目: 设计一个算法,算出 n 阶乘有多少个尾随零. 示例 1: 输入: 3输出: 0解释: 3! = 6, 尾数中没有零.示例 2: 输入: 5输出: 1解释: 5! = 120, 尾数中有 1 个零.说明: 你算法的时间复杂度应为 O(log n) . 分析: 计算阶乘后0的个数实际上就是在数5,一个5和一个偶数相乘就会产生一个0,而25会产生两个0,所以对于n大于0时,数它的5有多少个,除以5,如果还大于0就继续除以5,也就是在数25有几个,反复执行下去. 程序: class Soluti

程序员面试金典-面试题 16.20. T9键盘

题目: 在老式手机上,用户通过数字键盘输入,手机将提供与这些数字相匹配的单词列表.每个数字映射到0至4个字母.给定一个数字序列,实现一个算法来返回匹配单词的列表.你会得到一张含有有效单词的列表.映射如下图所示: 示例 1: 输入: num = "8733", words = ["tree", "used"] 输出: ["tree", "used"] 示例 2: 输入: num = "2"

程序员面试金典-面试题 17.04. 消失的数字

题目: 数组nums包含从0到n的所有整数,但其中缺了一个.请编写代码找出那个缺失的整数.你有办法在O(n)时间内完成吗? 注意:本题相对书上原题稍作改动 示例 1: 输入:[3,0,1] 输出:2 示例 2: 输入:[9,6,4,2,3,5,7,0,1] 输出:8 分析: 先利用高斯求和,然后依次减去数组中的每一个元素,剩下的值就是缺失值. 程序: class Solution { public int missingNumber(int[] nums) { int sum = (0 + nu

LeetCode题解分类汇总(包括剑指Offer和程序员面试金典,持续更新)

LeetCode题解汇总(持续更新,并将逐步迁移到本博客列表中) 剑指Offer 数据结构 链表 序号 题目 难度 06 从尾到头打印链表 简单 18 删除链表的节点 简单 22 链表中倒数第k个节点 简单 二叉树 序号 题目 难度 07 重建二叉树 中等 栈和队列 序号 题目 难度 09 用两个栈实现队列 简单 图 序号 题目 难度 12 矩阵中的路径 中等 13 机器人的运动范围 中等 算法 动态规划 序号 题目 难度 10- I 斐波那契数列 简单 10- II 青蛙跳台阶问题 简单 查找

程序员面试金典算法题

空格替换 题目描述 请编写一个方法,将字符串中的空格全部替换为"%20".假定该字符串有足够的空间存放新增的字符,并且知道字符串的真实长度(小于等于1000),同时保证字符串由大小写的英文字母组成. 给定一个string iniString 为原始的串,以及串的长度 int len, 返回替换后的string. 测试样例: "Mr John Smith",13 返回:"Mr%20John%20Smith" "Hello World&qu