代码随想录训练营day8
目录
题目一:反转字符串
解法一:数值交换
解法二:位运算
题目二:反转字符串||
题目三:替换空格
解法一:双指针
解法二:使用额外空间
题目四:翻转字符串里的单词
解法一:
解法二:纯属娱乐
题目五:左旋转字符串
总结:
题目一:反转字符串
力扣题目链接
题目描述:
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
思路分析: 简单的交换数值即可解决
解法一:数值交换
class Solution {public void reverseString(char[] s) {int left = 0;int right = s.length - 1;while (left < right) {char temp = s[left];s[left] = s[right];s[right] = temp;left++;right--;}}
}
解法二:位运算
class Solution {public void reverseString(char[] s) {int left = 0;int right = s.length - 1;while (left < right) {s[left] ^= s[right];s[right] ^= s[left];s[left] ^= s[right];left++;right--;}}
}
题目二:反转字符串||
力扣题目链接
题目描述:
给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
思路分析:关键在于找出需要进行反转的区间,再调用reverse()即可解决, 视频指路
class Solution {public String reverseStr(String s, int k) {int n = s.length();char[] ch = s.toCharArray();// 每次前进2k,但是只交换前k个字符for (int i = 0; i < ch.length; i += 2 * k) {reverse(ch, i, Math.min(i + k - 1, n - 1)); // 调用reverse()实现反转}return new String(ch);}private void reverse(char[] ch, int left, int right) {while (left < right) {char temp = ch[left];ch[left] = ch[right];ch[right] = temp;left++;right--;}}
}
题目三:替换空格
力扣题目链接
题目描述:请实现一个函数,把字符串
s
中的每个空格替换成"%20"
思路分析:不使用额外空间的话,考虑使用双指针解题,但要注意填充顺序是从后到前,至于为什么这么做?思路链接 里有讲。
解法一:双指针
class Solution {public String replaceSpace(String s) {StringBuilder str = new StringBuilder();for (int i = 0; i < s.length(); i++) {if (s.charAt(i) == ' ') {str.append(" "); // 尾部扩充空间,两倍空格} }if(str.length() == 0) {return s;}int left = s.length() - 1;s += str.toString(); // 将扩充的空间加入sint right = s.length() - 1;char[] ch = s.toCharArray(); // 字符串长度不可变,将新的s作为数组进行操作while (left >= 0) {if (ch[left] == ' ') { // 左指针遇到空格时,右指针下标递减,依次填入“0”,“2”,“%”ch[right--] = '0';ch[right--] = '2';ch[right] = '%';} else {ch[right] = ch[left];}left--;right--;}return new String(ch);}
}
解法二:使用额外空间
// 遍历添加,使用额外辅助空间
class Solution {public String replaceSpace(String s) {StringBuilder res = new StringBuilder();for (Character c : s.toCharArray()) {if (c == ' ') {res.append("%20");} else {res.append(c);}}return res.toString();}
}
题目四:翻转字符串里的单词
力扣题目链接
题目描述:
给你一个字符串 s ,请你反转字符串中 单词 的顺序。
单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。
思路分析:移除多余空格、将整个字符串反转、将每个单词反转。
涉及很多字符串的操作,细节一两句说不清,建议直接看carl哥的视频讲解
解法一:
class Solution {public String reverseWords(String s) {// 1.去除首尾以及中间多余空格StringBuilder sb = removeSpace(s);// 2.反转整个字符串reverseString(sb, 0, sb.length() - 1);// 3.反转各个单词reverseEachWord(sb);return sb.toString();}public StringBuilder removeSpace(String s) {int start = 0;int end = s.length() - 1;while (s.charAt(start) == ' ') start++; // 去除前面的空格while (s.charAt(end) == ' ') end--; // 去除后面的空格StringBuilder sb = new StringBuilder();while (start <= end) {char c = s.charAt(start);if (c != ' ' || sb.charAt(sb.length() - 1) != ' ') { // 去除中间多余空格sb.append(c);}start++;}return sb;}// 反转字符串public void reverseString(StringBuilder sb, int start, int end) {while (start < end) {char temp = sb.charAt(start);sb.setCharAt(start, sb.charAt(end));sb.setCharAt(end, temp);start++;end--;}}// 反转单词的字母顺序private void reverseEachWord(StringBuilder sb) {int start = 0;int end = 1;while (start < sb.length()) {while (end < sb.length() && sb.charAt(end) != ' ') {end++; // 取出单个单词}reverseString(sb, start, end - 1); // 调用reverseString方法反转单词start = end + 1; // 更新start到下一个单词首字母的位置end = start + 1; // 更新end的位置}}}
解法二:纯属娱乐
// 使用内置库函数解题
class Solution {public String reverseWords(String s) {// 除去开头和末尾的空白字符s = s.trim();// 正则匹配连续的空白字符作为分隔符分割List<String> wordList = Arrays.asList(s.split("\\s+"));Collections.reverse(wordList);return String.join(" ", wordList);}
}
注:本题java解法还有其他几种,需要了解,请移步代码随想录
题目五:左旋转字符串
力扣题目链接
题目描述:
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
思路分析:反转区间为前n的子串、反转区间为n到末尾的子串、反转整个字符串
class Solution {public String reverseLeftWords(String s, int n) {if (s == null || s.length() == 0) {return s;}int len = s.length();StringBuilder sb = new StringBuilder(s);reverseString(sb, 0, n - 1); // 反转前n个字母reverseString(sb, n, len -1); // 反转其它字母return sb.reverse().toString(); // 将反转后的的字符串再次反转}// 反转字符串public void reverseString(StringBuilder sb, int start, int end) {while (start < end) {char temp = sb.charAt(start);sb.setCharAt(start, sb.charAt(end));sb.setCharAt(end, temp);start++;end--;}}
}
总结:
题一、题二、题五至于掌握了反转函数的实现,都可简单解决
题三转换为数组,使用双指针进行填充即可
题四需要自己实现三个函数,分别是:移除多余空格、将整个字符串反转、将每个单词反转。最后在主函数中对字符串依次进行操作,感觉这样把步骤拆分出来,比较容易搞明白!
代码随想录训练营day8相关推荐
- 【代码随想录训练营】Day43-动态规划
代码随想录训练营 Day43 今日任务 1049.最后一块石头的重量Ⅱ 494.目标和 474.一和零 语言:Java 1049. 最后一块石头的重量Ⅱ 链接:https://leetcode.cn/ ...
- 【代码随想录训练营】【Day14】第六章|二叉树|理论基础|递归遍历|迭代遍历|统一迭代
理论基础 二叉树的定义形式有:节点指针和数组 在数组中,父节点的下标为i,那么其左孩子的下标即i*2+1,右孩子的下标即为i*2+2 二叉树的常见遍历形式有:前序遍历.后序遍历.中序遍历和层序遍历 前 ...
- 代码随想录训练营day56
题目一:两个字符串的删除操作 力扣题目链接 题目描述: 给定两个单词 word1 和 word2 ,返回使得 word1 和 word2 相同所需的最小步数. 每步 可以删除任意一个字符串中的一个字 ...
- 代码随想录训练营day57
题目一:回文子串 力扣题目链接 题目描述: 给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目. 回文字符串 是正着读和倒过来读一样的字符串. 子字符串 是字符串中的由连续字符组成的一 ...
- 代码随想录训练营day53
题目一:最长公共子序列 力扣题目链接 题目描述: 给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度.如果不存在 公共子序列 ,返回 0 . 一个字符串的 子序列 ...
- 代码随想录训练营day55
题目一:判断子序列 力扣题目链接 题目描述: 给定字符串 s 和 t ,判断 s 是否为 t 的子序列. 字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符 ...
- 代码随想录训练营day52
题目一:最长上升子序列 力扣题目链接 题目描述: 给你一个整数数组 nums ,找到其中最长严格递增子序列的长度. 子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序. ...
- 代码随想录训练营day48
题目一:打家劫舍 力扣题目链接 题目描述: 你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上 ...
- 代码随想录训练营day51
题目一:最佳买卖股票时机含冷冻期 力扣题目链接 题目描述: 给定一个整数数组prices,其中第 prices[i] 表示第 i 天的股票价格 . 设计一个算法计算出最大利润.在满足以下约束条件下 ...
最新文章
- CSS3 Box-shadow 阴影效果用法
- 全网唯一一个可以复现成功的光流计算项目
- 计算分数加减表达式的值
- php 导出word 高度,PHP导出word
- ASP.NET Core 优雅的在开发环境保存机密(User Secrets)
- 产品经验谈:设计思维 统计思维
- hexo+github 一小时搭建个人博客
- 有时间同情渣男傻女,不如想想人都是怎么被臆想出来的爱情给坑了
- java基础总结06-常用api类-Arrays
- Spring-装配Bean的3种方式-实现工厂方法方式装配Bean
- HDU2093--考试排名
- php创建对象出问题,activex部件不能创建对象
- android /data/system/dropbox,Android dropbox日志浅谈
- AppRTC服务器搭建
- 使用阿里云OSS完成文件的上传样例
- 嵌入式开发用到的一些工具
- struts2之token,类型转换和数据校验
- 什么是元认知?其效果和锻炼方法的介绍!
- 最详细的java调用含参数的python程序并且返回值
- DiasyDisk MAC上一款不错的磁盘可视化清理工具
热门文章
- 我可以用计算机做图吗,【我用Word和excel画图分别怎么制作】电脑excle怎样制作画图...
- 做软件测试工程师如何突破月薪20k?
- 元宇宙漫游指南-区块链构建元宇宙基础设施,一文搞清楚元宇宙和区块链
- 【软件定义汽车】【操作系统篇】特斯拉–Version
- 【Writeup】第六季极客大挑战(部分题目)
- 那些中国式家庭的小烦恼,我看用AI来解决就“都挺好”
- B - 爆零(×)大力出奇迹(√) HDU - 2093
- phpstorm中,光标变成一个长方红色块,如何调回来?
- Ubuntu VNC 如何调整分辨率
- 高通烧录软件QPST的介绍和使用方法