Day08代码随想录
今天熟悉了字符串的使用方式,以及一些字符串的处理方式和对应接口,比如去除前后空格s.trim()
以及如何使字符串变成字符数组char[] str = s.tocharArray(),及字符数组转成字符串String s = new String(str)
了解了StringBuilder 的使用方式
Day08
344.反转字符串
1.题目描述
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s
的形式给出。
不要给另外的数组分配额外的空间,你必须**原地修改输入数组**、使用 O(1) 的额外空间解决这一问题。
示例 1:
输入:s = ["h","e","l","l","o"]
输出:["o","l","l","e","h"]
示例 2:
输入:s = ["H","a","n","n","a","h"]
输出:["h","a","n","n","a","H"]
提示:
1 <= s.length <= 105
s[i]
都是 ASCII 码表中的可打印字符
2.解题思路及代码实现
很简单
class Solution {
public void reverseString(char[] s) {
for (int i = 0,j=s.length-1; i <=j ; i++,j--) {
char temp = s[i];
s[i] = s[j];
s[j] = temp;
}
}
}
541.反转字符串II
1.题目描述
给定一个字符串 s
和一个整数 k
,从字符串开头算起,每计数至 2k
个字符,就反转这 2k
字符中的前 k
个字符。
- 如果剩余字符少于
k
个,则将剩余字符全部反转。 - 如果剩余字符小于
2k
但大于或等于k
个,则反转前k
个字符,其余字符保持原样。
示例 1:
输入:s = "abcdefg", k = 2
输出:"bacdfeg"
示例 2:
输入:s = "abcd", k = 2
输出:"bacd"
提示:
1 <= s.length <= 104
s
仅由小写英文组成1 <= k <= 104
2.解题思路及其代码实现
模拟题,最开始不是很懂字符串的处理方式,看了卡哥的代码逐渐了解了,对该题也有了对应的思路
class Solution {
public String reverseStr(String s, int k) {
char[] strs = s.toCharArray();
for (int i = 0; i < strs.length; i+=2*k) {
if(i+k<=strs.length){
reverseString(strs,i,i+k-1);
}
else {
reverseString(strs,i,strs.length-1);
}
}
return new String(strs);
}
public void reverseString(char[] s,int i,int j) {
for (; i <=j ; i++,j--) {
char temp = s[i];
s[i] = s[j];
s[j] = temp;
}
}
}
卡码网:54.替换数字
1.题目描述
给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。 例如,对于输入字符串 “a1b2c3”,函数应该将其转换为 “anumberbnumbercnumber”。
输入描述
输入一个字符串 s,s 仅包含小写字母和数字字符。
输出描述
打印一个新的字符串,其中每个数字字符都被替换为了number
输入示例
a1b2c3
输出示例
anumberbnumbercnumber
提示信息
数据范围:
1 <= s.length < 10000。
2.解题思路及代码实现
由于我是java,所以要另外创建一个空间
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sr = new Scanner(System.in);
String s = sr.next();
Main p = new Main();
String a = p.replaceNum(s);
System.out.println(a);
}
public String replaceNum(String s) {
char[] str = s.toCharArray();
String result = "";
for (int i = 0; i < str.length; i++) {
if (str[i]>='0'&&str[i]<='9'){
result+="number";
}else
result+=str[i];
}
return result;
}
}
151.反转字符串中的单词
1.题目描述
给你一个字符串 s
,请你反转字符串中 单词 的顺序。
单词 是由非空格字符组成的字符串。s
中使用至少一个空格将字符串中的 单词 分隔开。
返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
**注意:**输入字符串 s
中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。
示例 1:
输入:s = "the sky is blue"
输出:"blue is sky the"
示例 2:
输入:s = " hello world "
输出:"world hello"
解释:反转后的字符串中不能存在前导空格和尾随空格。
示例 3:
输入:s = "a good example"
输出:"example good a"
解释:如果两个单词间有多余的空格,反转后的字符串需要将单词间的空格减少到仅有一个。
提示:
1 <= s.length <= 104
s
包含英文大小写字母、数字和空格' '
s
中 至少存在一个 单词
2.解题思路及其代码实现
1.利用java中的api实现去除空格和收尾空格
class Solution {
public String reverseWords(String s) {
s = s.trim();
String[] str = s.split("\\s+");
String result = "";
for (int i = 0,j=str.length-1; i <= j; i++,j--) {
String temp = str[i];
str[i] = str[j];
str[j] = temp;
}
for (int i = 0; i < str.length; i++) {
result+=str[i];
if (i!=str.length-1)
result+=" ";
}
return result;
}
}
2.利用双指针算法
class Solution {
public String reverseWords(String s) {
s = s.trim();
StringBuilder result = new StringBuilder();
int j = s.length()-1;
int i = j;
while(i>=0){
while(i>=0&&s.charAt(i)!=' ')i--;//找到第一个空格处的字符
result.append(s.substring(i+1,j+1)+" ");
while(i>=0&&s.charAt(i)==' ')i--;
j = i;
}
String result1 = result.toString();
return result1.trim();
}
}
卡码网:55.右旋字符串
1.题目描述
题目描述
字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。
例如,对于输入字符串 “abcdefg” 和整数 2,函数应该将其转换为 “fgabcde”。
输入描述
输入共包含两行,第一行为一个正整数 k,代表右旋转的位数。第二行为字符串 s,代表需要旋转的字符串。
输出描述
输出共一行,为进行了右旋转操作后的字符串。
输入示例
2
abcdefg
输出示例
fgabcde
提示信息
数据范围:
1 <= k < 10000,
1 <= s.length < 10000;
2.解题思路以及代码实现
三次反转实现右旋,第一次翻转,实现abcdefg到gfdcba,然后翻转前k个字符,最后翻转后n-k个字符
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sr = new Scanner(System.in);
int k = sr.nextInt();
String s = sr.next();
Main p = new Main();
String a = p.rotateString(s,k);
System.out.println(a);
}
public String rotateString(String s,int k) {
char[] str = s.toCharArray();
reverseString(str,0,s.length()-1);
reverseString(str,0,k-1);
reverseString(str,k,s.length()-1);
return new String(str);
}
public void reverseString(char[] s,int i,int j) {
for (; i <=j ; i++,j--) {
char temp = s[i];
s[i] = s[j];
s[j] = temp;
}
}
}