Rubyr代码随想录算法训练营第八天| 344.反转字符串、541. 反转字符串II、54.替换数字、151.翻转字符串里的单词、55.右旋转字符串
Leetcode?344.反转字符串?Reverse String
这题相对比较基础,使用双指针一左一右进行交换操作
public void reverseString(char[] s) {
if (s.length == 1) {
return;
}
int left = 0, right = s.length - 1;
while (left < right) {
char temp = s[left];
s[left] = s[right];
s[right] = temp;
left++;
right--;
}
}
Leetcode?541. 反转字符串II
1)每隔2k个字符的前k的字符
2)使用了两个指针i 和 j 进行移动, i 从0开始移动 2k步, j移动 i + k - 1步
3)注意j 的边界是永远小于字符串的长度
class Solution {
public void reverse(char[] c, int i, int j) {
while (i < j) {
char temp = c[i];//int temp = c[i]; 这里的值是字符不是数字
c[i] = c[j];
c[j] = temp;
i++;
j--;
}
}
public String reverseStr(String s, int k) {
if (s.length() == 1 || k == 1) {
return s;
}
char[] res = s.toCharArray();
int n = res.length - 1;
int i = 0;
// i = i + 2k, j = i + k - 1;
while (i < n) {
int j = Math.min(i + k - 1, n);
reverse(res, i, j);
i = i + 2 * k;//不能写成i = i + 2k;
}
String str = new String(res);
return str;
}
}
54.替换数字
给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。
例如,对于输入字符串 "a1b2c3",函数应该将其转换为 "anumberbnumbercnumber"。
对于输入字符串 "a5b",函数应该将其转换为 "anumberb"
输入:一个字符串 s,s 仅包含小写字母和数字字符。
输出:打印一个新的字符串,其中每个数字字符都被替换为了number
样例输入:a1b2c3
样例输出:anumberbnumbercnumber
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);
}
Leetcode 151.翻转字符串里的单词字符串复杂操作拿捏了! | LeetCode:151.翻转字符串里的单词_哔哩哔哩_bilibili
1) 去除首尾的空格以及中间多余空格, "the sky is blue"
2) 反转整个字符串,"eulb si yks eht"
3) 反转每个单词,"blue is sky the"
class Solution {
public String reverseWords(String s) {
// 去除首尾以及中间多余空格
StringBuilder sb = removeSpace(s);
// 反转整个字符串
reverseString(sb, 0, sb.length() - 1);
// 反转各个单词
reverseEachWord(sb);
return sb.toString();
}
private 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;
int n = sb.length();
while (start < n) {
while (end < n && sb.charAt(end) != ' ') {
end++;
}
reverseString(sb, start, end - 1);
start = end + 1;
end = start + 1;
}
}
}
55.右旋转字符串
字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。
例如,对于输入字符串 "abcdefg" 和整数 2,函数应该将其转换为 "fgabcde"。
输入:输入共包含两行,第一行为一个正整数 k,代表右旋转的位数。第二行为字符串 s,代表需要旋转的字符串。
输出:输出共一行,为进行了右旋转操作后的字符串。
样例输入:
2
abcdefg
样例输出:
fgabcde
数据范围:1 <= k < 10000, 1 <= s.length < 10000;
public class Main {
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--;
}
}
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!