344.反转字符串
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。
示例 1:
输入:["h","e","l","l","o"]
输出:["o","l","l","e","h"]
示例 2:
输入:["H","a","n","n","a","h"]
输出:["h","a","n","n","a","H"]
package Demo0313;
/**
* @author: 阿斋
* @Date Created in 2024/3/13 && 18:19
* @Description:344.反转字符串
*/
public class LeetCode344 {
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--;
}
}
public void reverseString01(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--;
}
}
}
541. 反转字符串II
给定一个字符串 s 和一个整数 k,从字符串开头算起, 每计数至 2k 个字符,就反转这 2k 个字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
示例:
输入: s = "abcdefg", k = 2
输出: "bacdfeg"
package Demo0313;
/**
* @author: 阿斋
* @Date Created in 2024/3/13 && 18:31
* @Description:541. 反转字符串II
*/
public class LeetCode541 {
public String reverseStr(String s, int k){
char[] ch = s.toCharArray();
for (int i = 0; i < ch.length; i+= 2*k) {
int start = i;
int end = Math.min(ch.length -1,start +k -1);
while (start < end){
ch[start] ^= ch[end];
ch[end] ^= ch[start];
ch[start] ^= ch[end];
start++;
end--;
}
}
return new String(ch);
}
}
替换数字
给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。
例如,对于输入字符串 "a1b2c3",函数应该将其转换为 "anumberbnumbercnumber"。
对于输入字符串 "a5b",函数应该将其转换为 "anumberb"
输入:一个字符串 s,s 仅包含小写字母和数字字符。
输出:打印一个新的字符串,其中每个数字字符都被替换为了number
样例输入:a1b2c3
样例输出:anumberbnumbercnumber
数据范围:1 <= s.length < 10000
package Demo0313;
import java.util.Scanner;
/**
* @author: 阿斋
* @Date Created in 2024/3/13 && 21:18
* @Description: 替换数字
* 给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。
*
* 例如,对于输入字符串 "a1b2c3",函数应该将其转换为 "anumberbnumbercnumber"。
*
* 对于输入字符串 "a5b",函数应该将其转换为 "anumberb"
*
* 输入:一个字符串 s,s 仅包含小写字母和数字字符。
*
* 输出:打印一个新的字符串,其中每个数字字符都被替换为了number
*
* 样例输入:a1b2c3
*
* 样例输出:anumberbnumbercnumber
*
* 数据范围:1 <= s.length < 10000
*/
public class LeetCode {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String s = in.nextLine();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < s.length(); i++) {
if(Character.isDigit(s.charAt(i))){
sb.append("number");
} else {
sb.append(s.charAt(i));
}
}
System.out.println(sb);
}
}
151.翻转字符串里的单词
给定一个字符串,逐个翻转字符串中的每个单词。
示例 1:
输入: "the sky is blue"
输出: "blue is sky the"
示例 2:
输入: " hello world! "
输出: "world! hello"
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
示例 3:
输入: "a good example"
输出: "example good a"
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
package Demo0313;
/**
* @author: 阿斋
* @Date Created in 2024/3/16 && 15:58
* @Description:
*/
public class LeetCode151 {
public String reverseWords(String s) {
//源字符数组
char[] initialArr = s.toCharArray();
//新字符数组
char[] newArr = new char[initialArr.length+1];//下面循环添加"单词 ",最终末尾的空格不会返回
int newArrPos = 0;
//i来进行整体对源字符数组从后往前遍历
int i = initialArr.length-1;
while(i>=0){
while(i>=0 && initialArr[i] == ' '){i--;} //跳过空格
//此时i位置是边界或!=空格,先记录当前索引,之后的while用来确定单词的首字母的位置
int right = i;
while(i>=0 && initialArr[i] != ' '){i--;}
//指定区间单词取出(由于i为首字母的前一位,所以这里+1,),取出的每组末尾都带有一个空格
for (int j = i+1; j <= right; j++) {
newArr[newArrPos++] = initialArr[j];
if(j == right){
newArr[newArrPos++] = ' ';//空格
}
}
}
//若是原始字符串没有单词,直接返回空字符串;若是有单词,返回0-末尾空格索引前范围的字符数组(转成String返回)
if(newArrPos == 0){
return "";
}else{
return new String(newArr,0,newArrPos-1);
}
}
}
右旋字符串
字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。
例如,对于输入字符串 "abcdefg" 和整数 2,函数应该将其转换为 "fgabcde"。
输入:输入共包含两行,第一行为一个正整数 k,代表右旋转的位数。第二行为字符串 s,代表需要旋转的字符串。
输出:输出共一行,为进行了右旋转操作后的字符串。
package Demo0313;
import java.util.Scanner;
/**
* @author: 阿斋
* @Date Created in 2024/3/16 && 16:00
* @Description:右旋字符串
*/
public class KaMaWang55 {
// public static void main(String[] args) {
// Scanner in = new Scanner(System.in);
// int n = Integer.parseInt(in.nextLine());
// String s = in.nextLine();
//
// int len = s.length(); //获取字符串长度
// char[] chars = s.toCharArray();
// reverseString(chars, 0, len - 1); //反转整个字符串
// reverseString(chars, 0, n - 1); //反转前一段字符串,此时的字符串首尾尾是0,n - 1
// reverseString(chars, n, len - 1); //反转后一段字符串,此时的字符串首尾尾是n,len - 1
//
// System.out.println(chars);
//
// }
//
// public static void reverseString(char[] ch, int start, int end) {
// //异或法反转字符串,参照题目 344.反转字符串的解释
// while (start < end) {
// ch[start] ^= ch[end];
// ch[end] ^= ch[start];
// ch[start] ^= ch[end];
// start++;
// end--;
// }
// }
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = Integer.parseInt(in.nextLine());
String s = in.nextLine();
int len = s.length(); //获取字符串长度
char[] chars = s.toCharArray();
reverseString(chars, 0, len - n - 1); //反转前一段字符串,此时的字符串首尾是0,len - n - 1
reverseString(chars, len - n, len - 1); //反转后一段字符串,此时的字符串首尾是len - n,len - 1
reverseString(chars, 0, len - 1); //反转整个字符串
System.out.println(chars);
}
public static void reverseString(char[] ch, int start, int end) {
//异或法反转字符串,参照题目 344.反转字符串的解释
while (start < end) {
ch[start] ^= ch[end];
ch[end] ^= ch[start];
ch[start] ^= ch[end];
start++;
end--;
}
}
}