首页 > 其他分享 >[刷题记录Day8]Leetcode

[刷题记录Day8]Leetcode

时间:2023-08-25 23:11:35浏览次数:37  
标签:right String Day8 StringBuilder start sb left Leetcode 刷题

No.1

题目

反转字符串

思路

  • 双指针,从头尾向中间遍历

代码

public void reverseString(char[] s) {
	char temp;
	int left = 0, right = s.length - 1;
	while (left < right) {
		temp = s[left];
		s[left] = s[right];
		s[right] = temp;
		left++;
		right--;
	}
}

No.2

题目

反转字符串 II

思路

  • 灵活使用for循环,每个step2k
  • 理解Math.min(s.length() - 1, start + k - 1),根据end的位置不同做调整
  • 换位置时候的start和end是左闭右闭区间

代码

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

No.3

题目

剑指 Offer 05. 替换空格

思路

  • 利用StringBuilder的append

代码

public String replaceSpace(String s) {  
    StringBuilder sb = new StringBuilder();  
    for (int i = 0; i < s.length(); i++) {  
        if (s.charAt(i) == ' ')  
            sb.append("%20");  
        else  
            sb.append(s.charAt(i));  
    }
    return sb.toString();  
}

No.4

题目

反转字符串中的单词
很考验字符串操作,实现比看起来要复杂得多

思路

  • 不用内置函数做
  • 移除首尾及中间多余空格
  • 将整个字符串反转
  • 将每个单词反转

代码

public String reverseWords(String s) {  
    // 去除首尾及中间的多余空格  
    StringBuilder sb = removeSpaces(s);  
  
    // 反转整个字符串  
    reverseString(sb, 0, sb.length() - 1);  
  
    // 反转单个单词  
    reverseEachWord(sb);  
  
    return sb.toString();  
}  
  
private StringBuilder removeSpaces(String str) {  
    int left = 0, right = str.length() - 1;  
    StringBuilder res = new StringBuilder();  
  
    // 去除首尾多余空格  
    while (str.charAt(left) == ' ') left++;  
    while (str.charAt(right) == ' ') right--;  
  
    while (left <= right) {  
        // 遇到非空格就append,遇到空格了,只保留已经在res中的那个  
        if (str.charAt(left) != ' ' || res.charAt(res.length() - 1) != ' ')  
            res.append(str.charAt(left));  
        left++;  
    }  
  
    return res;  
}  
  
private void reverseString(StringBuilder sb, int left, int right) {  
    while (left < right) {  
        char temp = sb.charAt(left);  
        sb.setCharAt(left, sb.charAt(right));  
        sb.setCharAt(right, temp);  
  
        left++;  
        right--;  
    }  
}  
  
private void reverseEachWord(StringBuilder sb) {  
    int left = 0, right = left + 1;  
  
    while (right < sb.length()) {  
        // 找到要反转的区间[left, right - 1]  
        while (right < sb.length() && sb.charAt(right) != ' ') right++;  
        reverseString(sb, left, right - 1);  
  
        left = right + 1;  
        right = left + 1;  
    }  
}

No.5

题目

剑指 Offer 58 - II. 左旋转字符串

思路

  1. 反转区间为前n的子串
  2. 反转区间为n到末尾的子串
  3. 反转整个字符串

代码

public String reverseLeftWords(String s, int n) {  
    StringBuilder sb = new StringBuilder(s);  
    for (int i = 0; i < n; i++) {  
        char c = sb.charAt(0);  
        sb.deleteCharAt(0);  
        sb.append(c);  
    }  
  
    return sb.toString();  
}

标签:right,String,Day8,StringBuilder,start,sb,left,Leetcode,刷题
From: https://www.cnblogs.com/tomatoQt/p/17658152.html

相关文章

  • [刷题记录Day9]Leetcode
    建议跳过No.1题目找出字符串中第一个匹配项的下标思路KMP代码No.2题目重复的子字符串思路KMP代码......
  • [刷题记录Day6]Leetcode哈希表
    No.1题目有效的字母异位词思路每个字符频率都相同,于是把字母表映射到长度为26的数组上代码publicbooleanisAnagram(Strings,Stringt){intlenS=s.length(),lenT=t.length();if(lenT!=lenS)returnfalse;int[]alphabet=newint[26]......
  • [刷题记录Day7]Leetcode哈希表
    No.1题目四数相加II思路很妙的办法:有四个数组A、B、C、D,用hashMap记录【A、B中数字之和】+【这些和出现的次数】,再遍历C、D中数字组合,寻找【0-C、D中数字之和】在hashMap中出现的次数,并累加本质上,这是把4个数组简化成了2个数组代码publicintfourSumCount(int[]nums1,......
  • 我害怕你,刷题的人——献给即将开始的高中
    小考、中考,期中考、期末考,单元考、月考,你从各种考试中走来。选择题、填空题、解答题;作用力的问题、赛跑的问题、溶液的问题;你认不认得这个字,你会写吗;他活了多少岁,他做了几件好事、几件坏事;函数、三角形还有一个圆,达·芬奇画画都在用的那些原理;run还是running,加to还是......
  • VSCode使用JavaScript刷LeetCode配置教程(亲试可以!)
    账号秘密都对,但是缺登录不成功的问题诀窍可能是:在属性设置中把LeetCode版本改成cn。点击LeetCode配置,修改Endpoint配置项,改成leetcode-cn,再次尝试登陆即可。  大家可移步原博文:https://blog.csdn.net/qq_37263248/article/details/124304402......
  • leetcode1260
    这是一道模拟题刚开始准备纯模拟,而后在题解看到一维压缩,才发现其实是将矩阵按行展开后进行k次右移操作。转换成一维后,难点就在转换坐标:行号=idx/列数;列号=idx%列数; ......
  • leetcode236求最近公共祖先
    递归TreeNode*dfs(TreeNode*root,TreeNode*p,TreeNode*q){if(!root)returnroot;//当发现这个节点已经是叶节点时,要告诉上层if(root==p||root==q)returnroot;//当发现是p节点或者q时也要告诉上层TreeNode*left=dfs(root->left,p,q);//左子树是否有p或者q......
  • Leetcode1636——按照频率将数组升序排序
    给你一个整数数组 nums ,请你将数组按照每个值的频率 升序 排序。如果有多个值的频率相同,请你按照数值本身将它们 降序 排序。 请你返回排序后的数组。 示例1:输入:nums=[1,1,2,2,2,3]输出:[3,1,1,2,2,2]解释:'3'频率为1,'1'频率为2,'2'频率为3。示例2:输入:nu......
  • 【LeetCode动态规划#16】矩阵的最小路径和、三角形的最小路径和
    矩阵的最小路径和给定一个包含非负整数的*m*x*n*网格grid,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:一个机器人每次只能向下或者向右移动一步。示例1:输入:grid=[[1,3,1],[1,5,1],[4,2,1]]输出:7解释:因为路径1→3→1→1→1的总和最小。......
  • LeetCode-21. 合并两个有序链表(Java)
    这是我在51CTO博客开启的写作之路,第一次正式写博客记录我在LeetCode的刷题日,希望能帮助更多的小伙伴攻面自己心仪的公司offer。如下对于 LeetCode-21.合并两个有序链表,进行全面解析并小结解题思路,同学们请参考:1.题目描述将两个升序链表合并为一个新的 升序 链表并返回。新链表......