LeetCode算法题-Reverse String II(Java实现)
这是悦乐书的第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+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。
以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!
LeetCode算法题-Reverse String II(Java实现)的更多相关文章
- LeetCode算法题-Reverse String(Java实现)
这是悦乐书的第205次更新,第217篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第73题(顺位题号是344).编写一个以字符串作为输入并返回字符串的函数.例如: 输入: ...
- LeetCode算法题-Reverse Bits(Java实现)
这是悦乐书的第185次更新,第187篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第44题(顺位题号是190).给定32位无符号整数,求它的反转位.例如: 输入:4326 ...
- LeetCode算法题-Rotate String(Java实现)
这是悦乐书的第317次更新,第338篇原创 在开始今天的算法题前,说几句,今天是世界读书日,推荐两本书给大家,<终身成长>和<禅与摩托车维修艺术>,值得好好阅读和反复阅读. 0 ...
- LeetCode算法题-Reverse Words in a String III(Java实现)
这是悦乐书的第259次更新,第272篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第126题(顺位题号是557).给定一个字符串,您需要反转句子中每个单词中的字符顺序,同 ...
- LeetCode算法题-Reverse Vowels of a String(Java实现-四种解法)
这是悦乐书的第206次更新,第218篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第74题(顺位题号是345).编写一个函数,它将一个字符串作为输入,并仅反转一个字符串的 ...
- LeetCode算法题-Valid Palindrome II(Java实现)
这是悦乐书的第287次更新,第304篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第155题(顺位题号是680).给定非空字符串s,最多可以删除一个字符. 判断它是否是回 ...
- LeetCode算法题-Repeated String Match(Java实现)
这是悦乐书的第289次更新,第307篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第156题(顺位题号是686).给定两个字符串A和B,找到A必须重复的最小次数,使得B是 ...
- LeetCode算法题-Construct String from Binary Tree(Java实现)
这是悦乐书的第273次更新,第288篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第141题(顺位题号是606).构造一个字符串,该字符串由二叉树中的括号和整数组成,并具 ...
- LeetCode算法题-Backspace String Compare(Java实现)
这是悦乐书的第327次更新,第350篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第197题(顺位题号是844).给定两个字符串S和T,如果两个字符串都输入到空文本编辑器 ...
随机推荐
- scala转换date提取年月日时分秒
从数据库提取出来的时间为 String 格式,现在需要转换为 date 并提取出里面的 小时 时间段: import java.text.SimpleDateFormat import java.ut ...
- python批量启动多线程
还未了解多线程的请查看博文 python3多线程趣味详解 python3多线程趣味详解 只是介绍了 python 多线程的使用,对于批量启动线程来说有些不适用,于是出现如下方法: 建立一个线程池,并将 ...
- python-redistest
# !/usr/bin/python3.4 # -*- coding: utf-8 -*- import redis import time # 这里用来读取ip def getips(): ip = ...
- C#版 - HDUoj 5391 - Zball in Tina Town(素数) - 题解
版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. HDUoj 5 ...
- Java基础18:Java序列化与反序列化
更多内容请关注微信公众号[Java技术江湖] 这是一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux ...
- React Native (一) 入门实践
上周末开始接触react native,版本为0.37,边学边看写了个demo,语法使用es6/7和jsx.准备分享一下这个过程.之前没有native开发和react的使用经验,不对之处烦请指出.笔者 ...
- 如何在SpringBoot中集成JWT(JSON Web Token)鉴权
这篇博客主要是简单介绍了一下什么是JWT,以及如何在Spring Boot项目中使用JWT(JSON Web Token). 1.关于JWT 1.1 什么是JWT 老生常谈的开头,我们要用这样一种工具 ...
- Spring Boot分布式系统实践【2】-框架搭建
前言 技术选型已经做完,那就来搭建框架了. 首先基于mvc思想,设计这套框架也是基于此,也会设计Dao层.Service层.Controller层.视图层等,同时也要考虑到dubbo的调用原理. ...
- google的GCM推送使用简介
pom <!-- https://mvnrepository.com/artifact/com.google.gcm/gcm-server --> <dependency> & ...
- leetcode — word-ladder-ii
import java.util.*; /** * Source : https://oj.leetcode.com/problems/word-ladder-ii/ * * * Given two ...