> 文档中心 > 卷进大厂系列之LeetCode刷题笔记:反转链表II(简单)

卷进大厂系列之LeetCode刷题笔记:反转链表II(简单)


学算法,刷力扣,加油卷,进大厂!

题目描述

力扣题目链接

给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。

  • 如果剩余字符少于 k 个,则将剩余字符全部反转。
  • 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

示例 1:

输入:s = "abcdefg", k = 2输出:"bacdfeg"

示例 2:

输入:s = "abcd", k = 2输出:"bacd"

提示:

  • 1 <= s.length <= 104
  • s 仅由小写英文组成
  • 1 <= k <= 104

涉及知识点

这是一道在反转链表的基础上改进的题目,只不过改过之后还是没有什么难度,毕竟单纯的使用数组,对大家 来说还是比较简单的。所以,我们依然可以使用数组的一些特征来解决这道题目。

  • 数组是存储在连续内存空间的相同类型数据的集合
  • 数组下标都是从0开始
  • 数组在内存空间的地址都是连续的
  • 字符串也是一种数组

那么根据题目,我们可以提炼的关键点:

  • 每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符
  • 如果剩余字符少于 k 个,则将剩余字符全部反转
  • 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样

解决这道题目我们只需要理解题意,即我们反转的字符并不是全部,而且某一部分,那解决这道题目就需要我们根据2k这个计数来确定需要反转的部分。

题目解答

Java题解一

思路分析

  • 首先我们需要把字符串放入数组,方便操作
  • 然后根据每次增加量为2k,进行循环遍历数组
  • 接着在上一步遍历的2k内,根据要求进行反转(前面说到的关键点)
  • 可以将反转数组单独写成一个方法
  • 最后需要把数组转化成字符串输出

代码实现

class Solution {    public String reverseStr(String s, int k) {  //把s放入数组 char[] arr = s.toCharArray(); //循环,每次增加量为2k for (int i = 0; i < arr.length; i += 2 * k) {     reverse(arr, i, Math.min(i + k, arr.length) - 1);//在2k内调用数组内反转,里面包含判断条件 } return new String(arr); //再转回字符串    }      public void reverse(char[] arr, int left, int right) { //整个字符串的反转(上一个题目详细注释) while (left < right) {     char temp = arr[left];     arr[left] = arr[right];     arr[right] = temp;     left++;     right--; }    } }

卷进大厂系列之LeetCode刷题笔记:反转链表II(简单)