目录
Leetcode 344 反转字符串
题目链接:Leetcode 反转字符串
文档讲解:代码随想录 反转字符串
视频讲解:b站视频
第一想法:用双指针法,设置头尾两个指针,交换头尾两个指针的内容,然后两个指针向中间移动,直到相交为止。(和代码随想录提供的想法大差不差)
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--;
}
}
}
Leetcode 541 反转字符串II
题目链接:Leetcode 反转字符串II
文档讲解:代码随想录 反转字符串II
视频讲解:b站视频
在Java中s.toCharArray()函数可以将字符串s,转换成为一个char数组。
第一想法:又是一道自己可以写出来的题,虽然有点复杂。将字符串按长度2k进行分组,除了最后一组外,其它的组处理方式相同,均是找到改组中第一个数字和第k个数字,然后利用双指针进行交换;最后一组分情况讨论,如果剩余数字个数小于k(最后一组为2k个数的情况在此处做取模操作后余数为0也要排除这种情况),其余是另外一种情况。
class Solution {
public String reverseStr(String s, int k) {
char[] ch = s.toCharArray();
int iter_times = (int)Math.ceil((double)(ch.length)/(2*k));
for(int i=0; i<iter_times; i++){
if(i != iter_times-1){ //先是对除了最后一组外的其它组别进行交换操作
int left = i*2*k;
int right = left+k-1;
while(left<right){
char temp = ch[left];
ch[left] = ch[right];
ch[right] = temp;
left++;
right--;
}
}
else{
int leave_num = (ch.length)%(2*k);
if(leave_num<k && leave_num!=0){ //当最后一组剩余数字个数小于k时的操作,要注意leave_num=0的情况,这种情况说明改组别中有四个数字
int left = i*2*k;
int right = ch.length-1;
while(left<right){
char temp = ch[left];
ch[left] = ch[right];
ch[right] = temp;
left++;
right--;
}
}
else{
int left = i*2*k;
int right = left+k-1;
while(left<right){
char temp = ch[left];
ch[left] = ch[right];
ch[right] = temp;
left++;
right--;
}
}
}
}
return new String(ch);
}
}
学习记录:
我自己写的分类太多了,其实只要每次将i移动2k个位置,然后判断其中双指针交换法的起点和终点位置即可。另外交换的部分不用重复写,判断好双指针的起始位置后,交换的过程是一样的。
class Solution {
public String reverseStr(String s, int k) {
char[] ch = s.toCharArray();
for(int i = 0; i<ch.length; i=i+2*k){
int left = i;
int right = 0;
if(ch.length<i+k){ //组中所有内容均需交换
right = ch.length-1;
}
else{
right = left+k-1;
}
while(left<right){
char temp = ch[left];
ch[left] = ch[right];
ch[right] = temp;
left++;
right--;
}
}
return new String(ch);
}
}
卡码网 54 替换数字
题目链接:卡码网 替换数字
文档讲解:代码随想录 替换数字
第一想法:创建一个新的字符串记录结果,因为长度发生了变化,当前字符串从前往后遍历,如果是数字就替换成number。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in); // 创建Scanner对象并传入标准输入流(键盘)作为参数
String s = scanner.next(); // 通过调用scanner的next()方法获取输入的字符串,然后再通过charAt(0)方法提取第一个字符
char[] ch = s.toCharArray();
int num_c = 0;
for(char i:ch) {
if(i<='9' && i>='0') {
num_c++;
}
}
char[] res = new char[5*num_c+s.length()];
int j=0;
for(int i = 0; i<ch.length;i++) {
if(ch[i]<='9' && ch[i]>='0') {
res[j]='n';
res[j+1]='u';
res[j+2]='m';
res[j+3]='b';
res[j+4]='e';
res[j+5]='r';
j=j+6;
}
else {
res[j]=ch[i];
j++;
}
}
String f = new String(res);
System.out.print(f);
}
}
学习记录:
关键在于要从后往前填充,可以降低时间复杂度,因为从前往后的话,还要移动之后的内容,为当前的替换内容留出空间(在不创建新数组的情况下)。Java数组是定长的,必须创建一个新数组。
Leetcode 151 翻转字符串里单词
题目链接:Leetcode 翻转字符串里的单词
文档讲解:代码随想录 翻转字符串里的单词
视频讲解:b站视频
第一想法:没什么想法
学习记录:
妙啊!先翻转整个字符串,然后将每个单词的内容进行翻转就得到了目标内容。另外还要考虑删除多余的空格的问题。
class Solution {
public String reverseWords(String s) {
char[] ch = s.toCharArray();
//1.首先去除多余的空格
ch = remove_eSpace(ch);
//2.翻转整个字符串
ch = reverseCh(ch,0,ch.length-1);
//3.翻转每个单词
ch = reverseWord(ch);
return new String(ch);
}
public char[] remove_eSpace(char[] ch){
int slow = 0;
for(int fast = 0; fast<ch.length; fast++){
if(ch[fast] !=' '){
if(slow!=0){ //要在while前,防止出现末尾的空格没删除的情况
ch[slow] = ' ';
slow++;
}
while(fast<ch.length && ch[fast]!=' '){
ch[slow] = ch[fast];
slow++;
fast++;
}
}
}
char[] newch = new char[slow];
System.arraycopy(ch, 0, newch, 0, slow);
return newch;
}
public char[] reverseCh(char[] ch, int start, int end){
while(start<end){
char temp = ch[start];
ch[start] = ch[end];
ch[end] = temp;
start++;
end--;
}
return ch;
}
public char[] reverseWord(char[] ch){
int start = 0;
for(int end = 0; end<ch.length; end++){
while(end<ch.length && ch[end]!=' '){
end++;
}
ch = reverseCh(ch,start,end-1);
start = end+1;
}
return ch;
}
}
卡码网 55 右旋转字符串
题目链接:卡码网 右旋转字符串
文档讲解:代码随想录 右旋字符串
第一想法:找到要移动的字符起始位置及其前一个位置,用temp存储当前位置的内容,然后把前面的字符从后往前依次后移一个位置。
学习记录:
妙啊,可以引入字符串翻转,先翻转整个字符串,然后翻转前一部分,以及后一部分,得到目标字符串。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in); // 创建Scanner对象并传入标准输入流(键盘)作为参数
int num = Integer.parseInt(scanner.nextLine());
String s = scanner.nextLine();
char[] ch = s.toCharArray();
ch = re_ch(ch,0,ch.length-1);
ch = re_ch(ch,0,num-1);
ch = re_ch(ch,num,ch.length-1);
String f = new String(ch);
System.out.print(f);
}
public static char[] re_ch(char[] ch, int start, int end) {
while(start<end){
char temp = ch[start];
ch[start] = ch[end];
ch[end] = temp;
start++;
end--;
}
return ch;
}
}