344.反转字符串
本题具体位置:344.反转字符串
思路:
- 题目给定的输入是一个字符串数组,所以使用双指针来首尾两两交换,达到反转的目的;
具体代码为:
class Solution {
public void reverseString(char[] s) {
int len=s.length;
int left=0;
int right=len-1;
while(left<right){
char temp=s[left];
s[left]=s[right];
s[right]=temp;
right--;
left++;
}
}
}
这里有一个要特别注意的点:
-
我个人想当然地以为了在Java的Arrays库函数中给了reverse的方法,但是通过查询API文档,Arrays中没有给反转相关的方法!!!
-
Collections中给了一个反转的静态方法,Collections.reverse() ;用于反转列表中的元素,但是只能适用于列表,如Arraylist
541. 反转字符串II
题目具体位置:541. 反转字符串II
思路:
有以下要注意的点!!!
-
Java中String是原始数据类型,它是不可变的——即不能直接更改字符串中的字符,尝试更改的话会导致编译错误。
-
所以可以尝试将String 转换成字符数组, 如char[] ch=s.toCharArray();
-
如若要将字符数组转换成String,可调用String的构造函数 String s=new String(ch);
具体代码如下:
class Solution {
public String reverseStr(String s, int k) {
//Java中String类型不可变,故先将其转成字符数组
char[] ch=s.toCharArray();
//获取字母的实际个数
int letterNum=ch.length;
//计算需要循环的个数
int group=letterNum/(2*k);
boolean flag=false;
//如果剩余字符少于k个,则额外处理
if(letterNum%(2*k)<k){
flag=true;
}
else{
group++;
}
//循环,交换对应位置上的字母
for(int i=0;i<group;i++){
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--;
}
}
//前面最初始已经判断过,如果确实需要额外处理
//将剩余少于k个的字母完成交换
if(flag){
int left=group*2*k;
int right=ch.length-1;
while(left<right){
char temp=ch[left];
ch[left]=ch[right];
ch[right]=temp;
left++;
right--;
}
}
return new String(ch);
}
}
看了其他解法之后,对自己的代码略作修改,提高高效性,将需要独立出来运行的那个“剩余小于k个的字母反转”一起揉进去
class Solution {
public String reverseStr(String s, int k) {
char[] ch = s.toCharArray();
for(int i = 0;i < ch.length;i += 2 * k){
int left= i;
// 判断尾数够不够k个来取决end指针的位置
int right= Math.min(ch.length - 1,left+ k - 1);
while(left< right){
char temp = ch[left];
ch[left] = ch[right];
ch[right] = temp;
left++;
right--;
}
}
return new String(ch);
}
}
151.翻转字符串里的单词
题目链接:151.翻转字符串里的单词
这里顺带熟悉一下Java中关于String的一些库函数:
class Solution {
public String reverseWords(String s) {
//将s转化为数组,首先将s的前后空格都给去掉,再调用库函数split,
String[] s1=s.trim().split(" ");
StringBuffer result=new StringBuffer();
//从后往前遍历数组s1
for(int i=s1.length-1;i>=0;i--){
//因为前面已经将s的前后空格都给去掉了,这里主要讨论各“单词”之间的多个空格
//如果各个单词之间有多个空格,调用split()方法,数组中就会出现""这种东西。
if(s1[i]!=""){
result.append(s1[i]);
result.append(" ");
}
}
return result.toString().trim();
}
}
KMPKMPKMPKMPKMPKMPKMPKMPKMPKMPKMPKMPKMPKMPKMPKMPKMPKMP!!!! 没有产出