前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode 748:license-key-formatting(密钥格式化)

LeetCode 748:license-key-formatting(密钥格式化)

作者头像
后台技术汇
发布2022-05-30 09:33:28
2060
发布2022-05-30 09:33:28
举报
文章被收录于专栏:后台技术汇

Together for a Shared future

一起向未来

今天我们练习另外一道题目:《 482. 密钥格式化》。

题目描述

有一个密钥字符串 S ,只包含字母,数字以及 '-'(破折号)。其中,N 个 '-' 将字符串分成了 N+1 组。给你一个数字 K,请你重新格式化字符串,使每个分组恰好包含 K 个字符。特别地,第一个分组包含的字符个数必须小于等于 K,但至少要包含 1 个字符。两个分组之间需要用 '-'(破折号)隔开,并且将所有的小写字母转换为大写字母。

给定非空字符串 S 和数字 K,按照上面描述的规则进行格式化。

示例 1:

代码语言:javascript
复制
输入:S = "5F3Z-2e-9-w", K = 4
输出:"5F3Z-2E9W"
解释:字符串 S 被分成了两个部分,每部分 4 个字符;
     注意,两个额外的破折号需要删掉。

示例 2:

代码语言:javascript
复制
输入:S = "2-5g-3-J", K = 2
输出:"2-5G-3J"
解释:字符串 S 被分成了 3 个部分,按照前面的规则描述,第一部分的字符可以少于给定的数量,其余部分皆为 2 个字符。

提示:

  • S 的长度可能很长,请按需分配大小。K 为正整数。
  • S 只包含字母数字(a-z,A-Z,0-9)以及破折号'-'
  • S 非空

取模&反转

代码语言:javascript
复制
    /**
     * 执行用时:11 ms, 在所有 Java 提交中击败了65.27%的用户
     * 内存消耗:41.5 MB, 在所有 Java 提交中击败了15.7%的用户
     * @param s
     * @param k
     * @return
     */
    public static String licenseKeyFormatting(String s, int k) {
        StringBuilder ans = new StringBuilder();
        int cnt = 0;

        // 倒序遍历字符串
        for (int i = s.length() - 1; i >= 0; i--) {
            if (s.charAt(i) != '-') {
                cnt++;
                // 拼接字符,转换大写
                ans.append(Character.toUpperCase(s.charAt(i)));
                // 取模分组,加上分隔符
                if (cnt % k == 0) {
                    ans.append("-");
                }
            }
        }
        // 兜底处理分隔符'-'
        if (ans.length() > 0 && ans.charAt(ans.length() - 1) == '-') {
            ans.deleteCharAt(ans.length() - 1);
        }

        return ans.reverse().toString();
    }

StringBuilder的使用

用到了比较多的工具类内置方法,比如:

  • 删除某个元素,底层是通过复制子序列来完成的;
代码语言:javascript
复制
    public AbstractStringBuilder deleteCharAt(int index) {
        if ((index < 0) || (index >= count))
            throw new StringIndexOutOfBoundsException(index);
        System.arraycopy(value, index+1, value, index, count-index-1);
        count--;
        return this;
    }
  • 反转数组,底层还涉及到了UTF-16的字符处理; (Surrogate Pair是UTF-16中用于扩展字符而使用的编码方式,是一种采用四个字节(两个UTF-16编码)来表示一个字符)
代码语言:javascript
复制
    public AbstractStringBuilder reverse() {
        boolean hasSurrogates = false;
        int n = count - 1;
        // //以数组中间位置为中心对调元素
        for (int j = (n-1) >> 1; j >= 0; j--) {
            int k = n - j;
            char cj = value[j];
            char ck = value[k];
            value[j] = ck;
            value[k] = cj;
            // //如果有surrogate pair,对调后highsurrogate与lowsurrogate也对调了,要换回来。
            if (Character.isSurrogate(cj) ||
                Character.isSurrogate(ck)) {
                hasSurrogates = true;
            }
        }
        if (hasSurrogates) {
            reverseAllValidSurrogatePairs();
        }
        return this;
    }

复杂度分析

  • 时间复杂度:O(N),其中 N 为字符串的长度。一共需要两次遍历,第一次遍历字符串求得目标字符串,第二次遍历需要将目标字符串进行反转。
  • 空间复杂度:O(1) 或 O(N),其中 N 为字符串的长度。这里的空间复杂度统计的是存储返回值以外的空间。如果使用的语言可以修改字符串,那么反转前后的字符串可以存储在同一片区域,空间复杂度为 O(1);如果不可以修改,那么反转前的字符串需要额外的空间进行存储,空间复杂度为 O(N)。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-03-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 后台技术汇 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档