From 48fa58f8f214571d2ccbeaf6ecb176fb68360d46 Mon Sep 17 00:00:00 2001 From: dingjiawen <745518019@qq.com> Date: Fri, 9 Sep 2022 15:02:46 +0800 Subject: [PATCH] =?UTF-8?q?leecode=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../markilue/leecode/string/ReverseStr.java | 147 ++++++++++++++++++ .../leecode/string/ReverseString.java | 63 ++++++++ .../markilue/leecode/string/ReverseWords.java | 104 +++++++++++++ 3 files changed, 314 insertions(+) create mode 100644 Leecode/src/main/java/com/markilue/leecode/string/ReverseStr.java create mode 100644 Leecode/src/main/java/com/markilue/leecode/string/ReverseString.java create mode 100644 Leecode/src/main/java/com/markilue/leecode/string/ReverseWords.java diff --git a/Leecode/src/main/java/com/markilue/leecode/string/ReverseStr.java b/Leecode/src/main/java/com/markilue/leecode/string/ReverseStr.java new file mode 100644 index 0000000..50387ac --- /dev/null +++ b/Leecode/src/main/java/com/markilue/leecode/string/ReverseStr.java @@ -0,0 +1,147 @@ +package com.markilue.leecode.string; + +import org.junit.Test; + +/** + * @BelongsProject: Leecode + * @BelongsPackage: com.markilue.leecode.string + * @Author: dingjiawen + * @CreateTime: 2022-09-09 10:16 + * @Description: TODO 力扣541题 反转字符串II: + * 给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。 + * 1)如果剩余字符少于 k 个,则将剩余字符全部反转。 + * 2)如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。 + * @Version: 1.0 + */ +public class ReverseStr { + + @Test + public void test() { + + String s = "abcdefghij"; + int k = 3; + String s1 = reverseStr(s, k); + System.out.println(s1); + + } + + @Test + public void test1() { + + String s = "abcd"; + int k = 2; + String s1 = reverseStr(s, k); + System.out.println(s1); + + } + + @Test + public void test2() { + + String s = "hyzqyljrnigxvdtneasepfahmtyhlohwxmkqcdfehybknvdmfrfvtbsovjbdhevlfxpdaovjgunjqlimjkfnqcqnajmebeddqsgl"; + int k = 39; + String s1 = reverseStr(s, k); + System.out.println(s1); + + } + + @Test + public void test3() { + + String s = "abcdefg"; + int k = 39; + String s1 = reverseStr(s, k); + System.out.println(s1); + + } + + /** + * 本人的思路:fori一下,i步长为2k,2k内部就自己进行交换;for完之后判断i==length还是i 2 * k) { + //留下最后2k以内的范围单独处理,因为要分情况单独处理 + for (; i < chars.length - 2 * k; i += 2 * k) { + int z = i; + //前k个字母反转:i和i+k-1交换 + while (z < i + k / 2) { + exchange(chars, z, i + k - 1 - z + i); + z++; + } + } + } + + //出来以后判断是从什么条件出来的 + if (i >= chars.length - k) { + //剩下的长度= chars.length - 2 * k) { + //剩下的长度<2k + //交换前k个 + int z = i; + while (z < i + k / 2) { + exchange(chars, z, i + k - 1 - z + i); + z++; + } + } + + + String result = ""; + for (char aChar : chars) { + result += aChar; + } + return result; + } + + /** + * 官方的思路:与本人的类似,但是不用留下剩下的做判断,都把他视作交换全部的一部分,只不过是左右范围不同 + * 速度击败100%,内存击败35% + * + * @param s + * @param k + * @return + */ + public String reverseStr1(String s, int k) { + + char[] chars = s.toCharArray(); + //均是交换,只不过是交换的范围不同,这样就可以不用分头处理了 + for (int i = 0; i < chars.length; i += 2 * k) { + reverse(chars,i,Math.min(i+k,chars.length)-1); + } + + return new String(chars); + + } + + public void reverse(char[] chars,int left,int right){ + while (left= 0; i--) { + if (!"".equals(s1[i]) ) { + result += s1[i] + " "; + } + } + + return result.trim(); + + } + + /** + * 速度超过12%,内存超过5% + * @param s + * @return + */ + public String reverseWords1(String s) { + + String[] s1 = s.trim().split(" "); + String result = ""; + for (int i = s1.length - 1; i >= 0; i--) { + if (!"".equals(s1[i]) ) { + if(i==0){ + result += s1[i]; + }else { + result += s1[i] + " "; + } + + } + } + return result; + + } + + /** + * 官方使用API的代码 + * 速度超过12%,内存超过5% + * @param s + * @return + */ + public String reverseWords2(String s) { + + // 除去开头和末尾的空白字符 + s = s.trim(); + // 正则匹配连续的空白字符作为分隔符分割 + List wordList = Arrays.asList(s.split("\\s+")); + Collections.reverse(wordList); + return String.join(" ", wordList); + + + } + + + + + + +}