字符串变换 482、6、68

news2024/12/24 21:18:32

482. 密钥格式化(简单)(20mins)

给定一个许可密钥字符串 s,仅由字母、数字字符和破折号组成。字符串由 n 个破折号分成 n + 1 组。你也会得到一个整数 k 。

我们想要重新格式化字符串 s,使每一组包含 k 个字符,除了第一组,它可以比 k 短,但仍然必须包含至少一个字符。此外,两组之间必须插入破折号,并且应该将所有小写字母转换为大写字母。

返回 重新格式化的许可密钥 。

示例 1:

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

示例 2:

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

提示:

  • 1 <= s.length <= 105
  • s 只包含字母、数字和破折号 '-'.
  • 1 <= k <= 104

解法一、从后往前遍历分组

 意想不到的用时 why

class Solution {
    public static String licenseKeyFormatting(String s, int k) {
        int ptr = s.length()-1;
        StringBuffer sb = new StringBuffer();
        s = s.toUpperCase();
        while(ptr >=0){
            for(int i = 0;i < k;i++){
                if(ptr < 0) break;
                if(s.charAt(ptr)!= '-'){
                    sb.insert(0,s.charAt(ptr));
                }else{
                    i--;
                }
                ptr--;
            }
            sb.insert(0,'-');
        }
        while(sb.length() > 0 && sb.charAt(0) == '-')sb.delete(0,1);
        return sb.toString();
    }
}

解法二、解法一优化

这个不再是循环四次一添加’-‘,而是手动添加计时器,这样最后也最多多出来一个。学会了。。。

class Solution {
    public 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();
    }
}

作者:力扣官方题解
链接:https://leetcode.cn/problems/license-key-formatting/solutions/1029860/mi-yao-ge-shi-hua-by-leetcode-solution-xnae/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 
6. Z 字形变换(中等)(30mins)

将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。

比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下:

P   A   H   N
A P L S I I G
Y   I   R

之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYIR"

请你实现这个将字符串进行指定行数变换的函数:

string convert(string s, int numRows);

示例 1:

输入:s = "PAYPALISHIRING", numRows = 3
输出:"PAHNAPLSIIGYIR"
示例 2:
输入:s = "PAYPALISHIRING", numRows = 4
输出:"PINALSIGYAHRPI"
解释:
P     I    N
A   L S  I G
Y A   H R
P     I

示例 3:

输入:s = "A", numRows = 1
输出:"A"

提示:

  • 1 <= s.length <= 1000
  • s 由英文字母(小写和大写)、',' 和 '.' 组成
  • 1 <= numRows <= 1000

解法一、下标操作

k是循环数,如上图中,PAYPAL是一组循环,ISHIRI是一组循环,NG是一组循环。对于非第一行也非最后一行,固定有两个数;对于第一行和最后一行,一个数即可。

下图来自官解评论区~

public static String convert(String s, int numRows) {
        if(numRows == 1) return s;
        int k = 2 * numRows - 2;
        int len = s.length();
        StringBuffer sb = new StringBuffer();
        for(int i = 0;i < numRows;i++){
            int ptr = i;
            if(i != 0 && i != numRows -1){
                while(ptr < len){
                    sb.append(s.charAt(ptr));
                    if(ptr + k - 2 *i < len)sb.append(s.charAt(ptr + k - 2 *i));
                    ptr += k;
                }
            }else{
                while(ptr < len){
                    sb.append(s.charAt(ptr));
                    ptr += k;
                }
            }
        }
        return sb.toString();
    }

 

解法二、也是下标操作

解法一是假定它已经填好,对于新字符串的每个字符,映射找到原来的下标。这个是按s的原顺序遍历,靠原有字符映射出新字符的下标,把每个字符发配到该有的地方jpg。flag控制方向,到了边缘则返回,最后拼接每一行的字符串。

比上个慢1s,应该是用了ArrayList的缘故

class Solution {
    public String convert(String s, int numRows) {
        if(numRows < 2) return s;
        List<StringBuilder> rows = new ArrayList<StringBuilder>();
        for(int i = 0; i < numRows; i++) rows.add(new StringBuilder());
        int i = 0, flag = -1;
        for(char c : s.toCharArray()) {
            rows.get(i).append(c);
            if(i == 0 || i == numRows -1) flag = - flag;
            i += flag;
        }
        StringBuilder res = new StringBuilder();
        for(StringBuilder row : rows) res.append(row);
        return res.toString();
    }
}

作者:Krahets
链接:https://leetcode.cn/problems/zigzag-conversion/solutions/21610/zzi-xing-bian-huan-by-jyd/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

68. 文本左右对齐(困难)(45mins)

class Solution {
    public static List<String> fullJustify(String[] words, int maxWidth) {
        int num = words.length;
        int p = 0,q = 0;
        List<String> res = new ArrayList<>();
        if(num == 1){//处理单个的情况
            while(maxWidth > words[0].length()){
                words[0]=words[0]+' ';
            }
            res.add(words[0]);
            return res;
        }
        while(q < num){
            int lenSum = words[p].length()+1;
            while(q+1 < num && lenSum + words[q+1].length() <= maxWidth){
                lenSum += words[q+1].length() + 1;
                q++;
            }
            int space=0,spaceAver=0,SpaceNum = 0;
            if(q != p){
                space = (maxWidth - (lenSum - (q + 1 - p)));
                spaceAver = space/(q - p);//每个空格位的基数
                SpaceNum = space - spaceAver * (q - p);//需要+1的数量
            }
            StringBuffer sb = new StringBuffer();
            for(int i = p;i <= q;i++){
                if(p==q || q == num -1){//最后一行
                    while(p!=q){
                        sb.append(words[p]);
                        sb.append(" ");
                        p++;
                    }
                    sb.append(words[q]);
                    while(sb.length() < maxWidth){
                        sb.append(" ");
                    }
                    break;
                }else {//其他情况
                    sb.append(words[i]);
                    if(i != q)for(int j = 0;j < spaceAver;j++)sb.append(" ");
                    if(SpaceNum > 0){
                        sb.append(" ");
                        SpaceNum--;
                    }
                }
            }
            res.add(sb.toString());
            p=q+1;
            q=p;
        }
        return res;
    }
}

解法一、贪心,模拟

借用了chat写一下注释~

初始化和简单情况处理

  1. 变量初始化:

    • num 存储单词的数量。

    • p 和 q 用于追踪当前行的开始和结束单词的索引。

    • res 用于存储结果的每一行。

  2. 单个单词处理:

    • 如果只有一个单词,直接将其后面填充空格至 maxWidth,然后添加到结果列表中。

主循环

  1. 计算行:

    • 使用两个指针 p 和 q 追踪当前正在处理的行的起始和结束单词。

    • lenSum 初始化为第一个单词的长度加上一个额外的空格(这个空格用于单词之间的分隔)。

    • 内部循环计算当前行可以容纳的单词。条件 lenSum + words[q+1].length() <= maxWidth 确保添加下一个单词加上空格不会超过最大宽度。

空格分配

  1. 空格计算:

    • space 计算整行剩余的空格数。

    • spaceAver 计算平均每对单词间应有的空格数。

    • SpaceNum 计算需要额外添加一个空格的空格位置数量(即不能均匀分配的那部分空格)。

构建行字符串

  1. 构建行:

    • 使用 StringBuffer 构建行。

    • 如果是最后一行或者只有一个单词,则左对齐,右边填充空格。

    • 否则,根据计算出的 spaceAver 和 SpaceNum 分配空格。

更新指针和添加行

  1. 更新指针和添加结果:

    • 每处理完一行,更新 p 和 q 指针到下一行的起始位置。

    • 将构建好的行添加到结果列表 res 中。

返回结果

  1. 返回最终结果:

    • 循环结束后,返回包含所有行的列表 res

class Solution {
    public static List<String> fullJustify(String[] words, int maxWidth) {
        int num = words.length;
        int p = 0,q = 0;
        List<String> res = new ArrayList<>();
        if(num == 1){//处理单个的情况
            while(maxWidth > words[0].length()){
                words[0]=words[0]+' ';
            }
            res.add(words[0]);
            return res;
        }
        while(q < num){//此时肯定已经不是只有一个了
            int lenSum = words[p].length()+1;
            while(q+1 < num && lenSum + words[q+1].length() <= maxWidth){
                lenSum += words[q+1].length() + 1;
                q++;
            }
            int space=0,spaceAver=0,SpaceNum = 0;
            if(q != p){
                space = (maxWidth - (lenSum - (q + 1 - p)));
                spaceAver = space/(q - p);//每个空格位的基数
                SpaceNum = space - spaceAver * (q - p);//需要+1的数量
            }
            StringBuffer sb = new StringBuffer();
            for(int i = p;i <= q;i++){
                if(p==q || q == num -1){//最后一行
                    while(p!=q){
                        sb.append(words[p]);
                        sb.append(" ");
                        p++;
                    }
                    sb.append(words[q]);
                    while(sb.length() < maxWidth){
                        sb.append(" ");
                    }
                    break;
                }else {//其他情况
                    sb.append(words[i]);
                    if(i != q)for(int j = 0;j < spaceAver;j++)sb.append(" ");
                    if(SpaceNum > 0){
                        sb.append(" ");
                        SpaceNum--;
                    }
                }
            }
            res.add(sb.toString());
            p=q+1;
            q=p;
        }
        return res;
    }
}

 

 


碎碎念

  • 今天好标准的简中难(喂。
  • 基本考察代码的结构清晰性 有一些小的部分需要考虑,会影响到整体用时
  • 边界考虑一般就指针是否越数组界,字符串是不是空,有时候只有一长度的时候需要特殊考虑,然后有时候是『i = 0』 i+1往后看还是「i = 1」 i-1往前看也需要考虑
  • 这仨题其实还挺好玩的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1953961.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AndroidStudio 开发环境搭建

文章目录 AndroidStudio 开发环境搭建JDK 下载与安装&#xff0c;配置环境变量JDK1.8 下载安装配置环境变量新建JAVA_HOME编辑Path 下载AndroidStudio最新版本历史版本先安装JDK&#xff0c;后启动AS以管理员身份运行打开解决双击打不开的问题Error:你的主机中的软件中止了一个…

Golang | Leetcode Golang题解之第299题猜数字游戏

题目&#xff1a; 题解&#xff1a; func getHint(secret, guess string) string {bulls : 0var cntS, cntG [10]intfor i : range secret {if secret[i] guess[i] {bulls} else {cntS[secret[i]-0]cntG[guess[i]-0]}}cows : 0for i : 0; i < 10; i {cows min(cntS[i], c…

数据结构——单链表OJ题(下)

目录 一、链表的回文结构 思路一&#xff1a;数组法 &#xff08;1&#xff09;注意 &#xff08;2&#xff09;解题 思路二&#xff1a;反转链表法 &#xff08;1&#xff09; 注意 &#xff08;2&#xff09;解题 二、相交链表 &#xff08;1&#xff09;思路&#…

音频合成之百度飞浆微调保姆级教程

&#x1f3af; 这里我们使用&#xff0c;百度飞浆产品进行操作 至少需要提供一分钟的原声视频&#xff0c;越清晰越好&#xff0c;用于分析人物音色、声纹等特点。预防针&#xff1a;这块稍微有点难度&#xff0c;涉及代码&#xff0c;不过不用担心&#xff0c;照着操作即可。…

加载chatglm3模型时出现ValueError: too many values to unpack (expected 2)的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

MATLAB仿真:数字信号处理IIR数字滤波器设计

目录 1&#xff0e;实验目的 2&#xff0e;实验原理 3&#xff0e;实验仪器及设备 4. 实验内容及步骤 5&#xff0e;信号产生函数mstg清单 6.实验程序及波形如下&#xff1a; 1&#xff0e;实验目的 &#xff08;1&#xff09;熟悉用双线性变换法设计IIR数字滤波器的原理…

独立开发者系列(35)——python环境的理解

新手阶段&#xff0c;为了快速入门&#xff0c;基本都是直接开始写python代码实现自己想要的效果&#xff0c;类似搭建博客&#xff0c;写个web服务器&#xff0c;搭建简易聊天室&#xff0c;偶尔也写些爬虫&#xff0c;或者使用pygame写个简单小游戏&#xff0c;也有tk库做点简…

Android AI应用开发:移动检测

基于Google ML模型的Android移动物体检测应用——检测、跟踪视频中的物体 A. 项目描述 ML Kit物体检测器可以对视频流进行操作&#xff0c;能够检测视频中的物体并在连续视频帧中跟踪该物体。 相机捕捉视频时&#xff0c;检测到移动物体并为其生成一个边界框&#xff0c;并分…

【算法/训练】:动态规划(线性DP)

一、路径类 1. 字母收集 思路&#xff1a; 1、预处理 对输入的字符矩阵我们按照要求将其转换为数字分数&#xff0c;由于只能往下和往右走&#xff0c;因此走到&#xff08;i&#xff0c;j&#xff09;的位置要就是从&#xff08;i - 1&#xff0c; j&#xff09;往下走&#…

2024第八届全国职工职业技能大赛“网络与信息安全管理员”赛项技术文件及任务书

2024第八届全国职工职业技能大赛“网络与信息安全管理员”赛项技术文件及任务书 一、赛项概述&#xff1a;二、竞赛形式&#xff1a;三、竞赛规则四、竞赛样题4.1、第一场4.1.2、实操闯关赛4.2、第二场4.3、第三场 需要培训可以私信博主 欢迎交流学习&#xff01; [X] &#x1…

Tuxera NTFS for Mac 2023安装教程+2024年软件Tuxera安装包下载

‌在数字化时代&#xff0c;文件格式的兼容性问题一直是用户头疼的问题。尤其是在Mac和Windows两大操作系统之间&#xff0c;由于文件系统的不统一&#xff0c;使得文件在不同平台之间的传输和访问变得困难。然而&#xff0c;随着Tuxera NTFS for Mac 2023的出现&#xff0c;这…

好书推荐 -- 《精通推荐算法》

新书发布&#xff0c;京东限时15天内5折优惠&#xff0c;半天即可送到。 图书封底有读者微信群&#xff0c;作者也在群里&#xff0c;任何技术、offer选择和职业规划的问题&#xff0c;都可以咨询。 《精通推荐算法》&#xff0c;限时半价&#xff0c;半日达https://u.jd.com…

[CISCN2019 华东南赛区]Web11

进来先做信息收集&#xff0c;右上角显示当前ip&#xff0c;然后有api的调用地址和请求包的格式以及最重要的是最下面的smarty模版&#xff0c;一看到这个就得想到smarty模版注入 测试了一下两个api都无法访问 直接切到数据包看看能不能通过XFF来修改右上角ip 成功修改&#x…

Unity横版动作游戏 -瓦片地形和动画瓦片

(规则瓦片)瓦片地形和动画瓦片 准备阶段 在Tilemap中创建一个新的文件夹起名叫做Rule Tile&#xff0c;创建一个Rule Tile&#xff0c;用来设置瓦片地形&#xff0c;我们将用他来绘制地形图&#xff0c;类似于Godot中的瓦片地形。 这里给他取名为了Ground 1&#xff0c;用于创…

ARM32开发——PWM蜂鸣器案例

&#x1f3ac; 秋野酱&#xff1a;《个人主页》 &#x1f525; 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 需求原来的驱动移植操作替换初始化 更新Play函数完整代码 需求 通过控制PB9来播放音乐&#xff0c;PB9对应的定时器通道&#xff1…

CTF之网站被黑

简单看一下网页和源码没发现什么明显漏洞 那就扫描一下目录 发现了/shell.php文件&#xff0c;访问一下&#xff0c;发现是一个后台管理登录页面 别无他法只能爆破喽&#xff0c;爆破后发现密码是hack flag{25891d9e9d377f006eda3ca7d4c34c4d}

2024第三届钉钉杯大学生大数据挑战赛【A题】完整分享

2024第三届钉钉杯大学生大数据挑战赛已经开赛&#xff0c;小编给大家带来非常实用的助力【A题】完整&#xff0c;&#xff08;看图片下方的说明&#xff09;&#xff0c;资料预览&#xff1a; 微信公众号

【python】批量读取Word文档中的特定表格并保存为Excel文件

批量读取Word文档中的特定表格并保存为Excel文件 在工作中&#xff0c;我们常常需要从多个Word文档中提取数据&#xff0c;然后将这些数据汇总到一个Excel文件中进行分析。下面&#xff0c;我将分享一个Python脚本&#xff0c;它可以从多个Word文档中读取特定的表格数据&#…

暑期c++ 命名空间

有任何不懂的问题可以评论区留言&#xff0c;能力范围内都会一一回答 今天是暑期第一天开始写c笔记&#xff0c;新起点&#xff0c;新开始加油 我们先来看两串代码 这串代码编译没有问题 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int rand 14; int main(…

手机图片如何转化为word文档?分享3种好用的软件。

在数字化时代&#xff0c;手机已经成为我们生活中不可或缺的一部分。随着手机拍照功能的日益强大&#xff0c;我们常常用手机记录下重要的信息和瞬间。但你有没有遇到过这样的烦恼&#xff1a;如何将手机里的图片快速转化为可编辑的Word文档呢&#xff1f;今天&#xff0c;就为…