LeetCode算法题-Reverse String II(Java实现)

告别SD卡!手把手教你用NVMe硬盘盒给Jetson Orin Nano离线烧录Ubuntu系统 本文详细介绍了如何利用NVMe硬盘盒为Jetson Orin Nano离线烧录Ubuntu系统,替代传统SD卡方案。通过硬件选择、系统镜像准备到烧录命令的全流程解析,帮助开发者提升存储性能与系统稳定性,特别适合嵌入式开发场景。 阅读详情

这是悦乐书的第256次更新,第269篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第123题(顺位题号是541)。给定一个字符串和一个整数k,你需要反转从字符串开头算起的每2k个字符的前k个字符。 如果剩下少于k个字符,则反转所有字符。 如果小于2k但大于等于k个字符,则反转前k个字符,剩下的字符不变。例如:

输入:s =“abcdefg”,k = 2
输出:“bacdfeg”

注意:

  • 该字符串仅包含小写的英文字母。

  • 给定字符串的长度和k将在[1,10000]范围内。

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

根据题意,如果一个字符串的长度为n,每隔k位(从0开始)反转k位字符,如当k等于2时,0-1位字符反转,2-3位不变,4-5位反转,依次往后,直到处理完所有字符。所以可以直接使用for循环,每次循环处理2k个字符,借助StringBuilder类,第一次截取i到i+k长度的子串,此子串进行反转,第二次截取i+k到i+2k长度的子串,此子串不需要反转,对字符串进行截取的时候,需要判断是否超出字符串长度。

public String reverseStr(String s, int k) {
    if (k == 1) {
        return s;
    }
    StringBuilder sb = new StringBuilder();
    for (int i=0; i<s.length(); i += 2*k) {
        StringBuilder temp = new StringBuilder();
        // 如果i加k后,超出字符串长度,直接反转剩下的字符即可,否则就截取k长度的子串
        temp.append(s.substring(i, i+k > s.length() ? s.length() : i+k));
        temp.reverse();
        // 如果i加k小于字符串长度,才会去继续截取后面剩下的子串
        if (i+k < s.length()) {
            temp.append(s.substring(i+k, i+2*k > s.length() ? s.length() : i+2*k));
        }
        sb.append(temp.toString());
    }
    return sb.toString();
}

03 第二种解法

我们也可以操作字符,不使用截取字符串的办法。将s转为字符数组,每次循环,处理2k个字符,然后对前k个字符进行反转(换位置),进行字符互换的时候,需要使用经典的三行代码:

char temp = arr[start];

arr[start] = arr[end];

arr[end] = temp;

很好记住,首尾相连即可。同样,此解法也需要考虑下标越界的问题,所以end会在当前起始索引、字符数组长度(字符串长度)之间取最小值。

public String reverseStr2(String s, int k) {
    if (k == 1) {
        return s;
    }
    char[] arr = s.toCharArray();
    for (int i=0; i<arr.length; i += 2*k) {
        int start = i;
        int end = Math.min(start+k-1, arr.length-1);
        while (start < end) {
            char temp = arr[start];
            arr[start] = arr[end];
            arr[end] = temp;
            start++;
            end--;
        }
    }
    return new String(arr);
}

04 小结

算法专题目前已日更超过三个月,算法题文章123+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

x265开源编码器源码框架深度解析 阅读详情

相关推荐

单细胞分析避坑指南:SCTransform和Harmony参数设置详解

本文深入解析了单细胞分析中SCTransform标准化与Harmony批次校正的关键参数设置。针对10x Genomics等数据,详细探讨了如何通过调整`vars.to.regress`、`theta`等核心参数,在有效去除技术噪音的同时,避免过度校正以保留关键的生物学差异,从而提升分析结果的可靠性与可解释性。

weixin_29053073的博客 608

LeetCode精选算法100题,从入门到入赘

算法是程序员的内功,掌握算法不仅能帮助你在面试中过关斩将,赢取 Dream Offer,更能充分锻炼你的逻辑思维与底层能力

IT邦德 1万+

3D美术14——max——fbx导入max后直接生成bip人形骨骼插件

最近经常会从unity里反八FBX到max里进行2次修改。 但是非常尴尬的事情就是,就是用max做的fbx,你在反导入回来,BIP骨骼都会变成预制体。这个时候有一个方法补救。那就是在导入的时候调整一下参数。(如下图) 把这里调整成设置为骨骼。就还可以了。 但是,如果你不是用max做的FBX。呵呵,那么你一定很头大,因为完全没有用。 所以,这个时候就要上插件了。 Autofbxtobip v.1.1 这个插件适用于2015及其以上版本。 在这之前我还用过一款叫BIPPY,但是效果相当感人,照着这个图片调整

qq_37576129的博客 1万+

LeetCode算法题整理(200题左右)

Leetcode

qq_38253797的博客 1万+

中兴B860AV2.1-A刷机避坑指南:晶晨免拆神器+安卓7.1.2固件实测

本文提供中兴B860AV2.1-A机顶盒的详细刷机教程,重点介绍使用晶晨免拆神器配合安卓7.1.2线刷固件包的实操步骤。内容涵盖刷机前的硬件确认、工具准备、软件设置、烧录全过程监控及常见问题解决,旨在帮助用户安全、高效地完成刷机,规避变砖风险,释放设备潜力。

pytorch8learner的博客 746

基于STM32的家用新风系统智能控制器 | 保姆式教程 开源可复刻

本项目基于STM32F103C8T6核心控制器,完整实现了家用新风系统智能控制器的全功能开发,覆盖多传感器数据采集、双模式控制、PID调速、异常报警、掉电记忆等核心功能,全程采用保姆式无跳步教学,从硬件选型、接线、CubeMX配置、代码开发、调试排坑全流程拆解,跟着步骤一步步操作,就能顺利完成项目复刻

ZhongWeiXiang9的博客 464

LeetCode算法:0~99道

冒泡排序 定义一个布尔变量 hasChange,用来标记每轮是否进行了交换。在每轮遍历开始时,将 hasChange 设置为 false。 若当轮没有发生交换,说明此时数组已经按照升序排列,hashChange 依然是为 false。此时外层循环直接退出,排序结束。 代码示例 Java import java.util.Arrays; public class BubbleSort { private static void bubbleSort(int[] nums) { b

qq_43265673的博客 657

ubuntu17.04 UHD 驱动出错

ubuntu 17.04 源码安装UHD

xrh003的博客 1万+

leetcode算法题目汇总

简单题: 1.两数之和 暴力遍历解决 7.整数反转 利用求商和求余解决 9.回文数 反转看一不一样,利用求商和求余解决 13.罗马数字转整数 遍历一遍,考虑特殊情况即可 14.最长公共前缀 先找到最短单词长度,然后对每个单词进行遍历 20.有效的括号 利用堆栈求解 21.合并两个有序链表 建立空头指针,然后开始在后面续两个里面较小的,直到有一个结束了,把省的那个直接续在后面 26....

qq_36852276的博客 1242

硬件基础知识-电机知识

步进电机存在空载启动频率,所以步进电机可以低速正常运转,但若高于一定速度时就无法启动,并伴有尖锐的啸叫声;在非超载的情况下,电机的转速、停止的位置只取决于脉冲信号的频率和脉冲数。给电机两根线供电,电机就可以旋转,给正电压,电机正转,给相反电压,电机反转;电压越大,电机转得越快,电压越小,转速也变小。是一种直流电机,有刷电机的定子上安装有固定的主磁极和电刷,转子上安装有电枢绕组和换向器。控制器:使用专用的电子控制器来监测和控制电机的转速、电流和方向。线圈电流方向的交替变化是随电机转动的换相器和电刷来完成的。

weixin_46969363的博客 2295

手把手教你完成基于matlab的LSTM时间序列分析

时间序列是按时间顺序组织的数字序列,是数据分析中重要的处理对象之一。时间序列的主要特点是数据获取方式一般具有客观性,能反映某种现象的变化趋势或统计指标,进而预测未来走向,这在本质上也是一个回归预测的问题。长短时记忆网络(Long Short-Term Memory,LSTM)是一种循环神经网络,适合处理有更长时间跨度的内部记忆,被广泛应用于时间序列分析,能够保持数据的内在持续性,反映数据的细粒度走势,具有良好的预测效果。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 896

Java面试题之LeetCode经典算法篇

【代码】Java面试题之LeetCode经典算法篇。

锐云游 1038

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

LeetCode - Reverse Words in a String I && II

https://leetcode.com/problems/reverse-words-in-a-string/ 这道题O(n)的方法很简单,就是遍历字符串,找到一个词就放到list里面,遍历完后把list里面的单词从后往前连起来就行。 而且本来我想用JAVA的s.split(" ")函数的,结果leetcode的用例全部都是不规律的,两个单词间N多空格,或者字符串前后都是空格之类的,所以用s

chilakaka的专栏 419

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Leetcode-541. Reverse String II

前言:为了后续的实习面试,开始疯狂刷题,非常欢迎志同道合的朋友一起交流。因为时间比较紧张,目前的规划是先过一遍,写出能想到的最优算法,第二遍再考虑最优或者较优的方法。如有错误欢迎指正。博主首发优快云,mcf171专栏。这次比赛略无语,没想到前3题都可以用暴力解。 博客链接:mcf171的博客 —————————————————————————————— Given a st

mcf171的专栏 2130

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

【Leetcode】541. Reverse String II

题目地址: https://leetcode.com/problems/reverse-string-ii/ 给定一个字符串,再给定一个正整数kkk。执行如下操作,对每2k2k2k个字符,翻转前kkk个;如果剩余数量小于kkk个,则将剩余全部翻转;如果剩余数量大于等于kkk个但不足2k2k2k个,则翻转前kkk个。代码如下: public class Solution { public S...

数学、算法爱好者的博客 304

leetcode (Reverse String II)

Title:Reverse String II     541 Difficulty:Easy 原题leetcode地址:https://leetcode.com/problems/reverse-string-ii/   1.    注解见代码注释 时间复杂度:O(n^2),嵌套循环。 空间复杂度:O(1),没有申请额外空间。 /** * 两层for循环,注意外...

hsx1612727380的专栏 154

LeetCode - 541. Reverse String II

链接 541. Reverse String II 题意 翻转字符串II 给定一个字符串和k,k表示要翻转前k个字母,然后跳过k个字母,再翻转k个字母...以此类推。当字符个数少于2k但大于等于k个时,翻转前k个字符并且剩余的保持不变。 思路 循环调用翻转字符串的方法即可。 代码 public class Solution { public String reverseStr(S...

106

leetcode 541. Reverse String II

很基础的一道题: class Solution { public String reverseStr(String s, int k) { String str = ""; int count = s.length()%k==0 ? s.length()/k : s.length()/k+1; for(int i=1;i<=count;...

xiaobailaji的博客 192

leetcode 541. Reverse String II 简单题也得多刷刷

leetcode  541. Reverse String II class Solution(object): def reverseStr(self, s, k): """ :type s: str :type k: int :rtype: str """ return s

独钓寒江雪 379

541. Reverse String II

题目地址:https://leetcode.com/problems/reverse-string-ii/description/Given a string and an integer k, you need to reverse the first k characters for every 2k characters counting from...

aodubi0638的博客 80

【Leetcode】186. Reverse Words in a String II

题目地址: https://leetcode.com/problems/reverse-words-in-a-string-ii/ 给定一个字符数组,按照空格分割为若干单词,要求反转单词的顺序。 用经典的两步翻转法即可。先翻转单词,再整个翻转。代码如下: public class Solution { public void reverseWords(char[] s) { if (s == null || s.length == 0) { return;

数学、算法爱好者的博客 235

Leetcode 186 Reverse Words in a String II

思路:先将整个数组reverse,然后遍历数组识别出每个单词,再将每一个单词reverse。由于这边要in-place ,不能用extra space。所以我们reverse的策略就是头尾互换,由头尾向中间推进。很简单,直接给出代码: class Solution { public void reverse(char[] s, int left, int right) { while(left < right){ char tmp = s[left];.

GoodJobJasper的博客 293

【LeetCode】541. Reverse String II 解题报告(Python)

【LeetCode】Reverse String II 解题报告标签(空格分隔): LeetCode题目地址:https://leetcode.com/problems/reverse-string-ii/#/description题目描述:Given a string and an integer k, you need to reverse the first k characters for

负雪明烛 1998

LeetCode 186. Reverse Words in a String II(反转单词)

原题网址:https://leetcode.com/problems/reverse-words-in-a-string-ii/ Given an input string, reverse the string word by word. A word is defined as a sequence of non-space characters. The input stri

James Pan 1893
上一篇: LeetCode算法题-Convert BST to Greater Tree(Java实现)
下一篇: LeetCode算法题-Diameter of Binary Tree(Java实现)
程序员小川
博客等级 码龄10年 47粉丝 305原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值