算法 字符串 day04

字符串

第一题:344. 反转字符串 - 力扣(LeetCode)

//双指针交换首尾元素
public void reverseString(char[] s) {
        int j = s.length - 1;
        for (int i = 0; i < s.length / 2; i++) {
            char temp = s[i];
            s[i] = s[j];
            s[j] = temp;
            j--;
        }
    }

第二题:541. 反转字符串 II - 力扣(LeetCode)

public static String reverseStr(String s, int k) {
        char[] chs = s.toCharArray();

        for (int i = 0; i < chs.length; i += 2 * k) {
            int start = i;
            //判断尾数够不够k个,取决于end指针的位置
            int end = Math.min(chs.length - 1,start + k - 1);
            
            while (start <end){
                char temp = chs[start];
                chs[start] = chs[end];
                chs[end] = temp;
                start++;
                end--;
            }
        }
        return String.valueOf(chs);
    }

第三题:54. 替换数字(第八期模拟笔试) (kamacoder.com)

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.next();

        StringBuilder sb = new StringBuilder(str);
        for (int i = 0; i < sb.length(); i++) {
            if (sb.charAt(i) >= '0' && sb.charAt(i) <= '9'){
                sb.deleteCharAt(i);
                sb.insert(i,"number");
                i = i + 5;
            }
        }

        System.out.println(String.valueOf(sb).toString());
    }
}

第四题:151. 反转字符串中的单词 - 力扣(LeetCode)(困难)

public static String reverseWords(String s) {
        // 1.去除首尾以及中间多余空格
        StringBuilder sb = removeSpace(s);
        //System.out.println(sb);

        // 2.反转单词.以空格为界限,进行反转
        String str = sb.toString();

        String[] split = str.split(" ");

        //双指针进行反转单词
        int j = split.length - 1;
        for (int i = 0; i < split.length / 2; i++, j--) {
            String temp = split[i];
            split[i] = split[j];
            split[j] = temp;
        }

        //System.out.println(Arrays.toString(split));
        StringBuilder s1 = new StringBuilder();
        for (int i = 0; i < split.length; i++) {
            if (i == split.length - 1){
                s1.append(split[i]);
            }else {
                s1.append(split[i]).append(" ");
            }
        }

        //将StringBuilder转为string
        String result = s1.toString();

        return result;
    }

    //双指针移除空格
    private static 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的最后一位不能是' '
                sb.append(c);
            }
            start++;
        }
        return sb;
    }

第五题:459. 重复的子字符串 - 力扣(LeetCode)

public boolean repeatedSubstringPattern(String s) {
        StringBuilder sb = new StringBuilder();
        //将字符串翻倍
        sb.append(s).append(s);

        //掐头去尾
        String substring = sb.substring(1, sb.length() - 1);

        //判断原来的字符串是否包含在substring中
        boolean contains = substring.contains(s);

        return contains;
    }
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值