代码随想录算法训练营第七天| LeetCode344.反转字符串、541.反转字符串ll、卡码网54.替换数字

344.反转字符串

题目:

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。

不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

思路:

双指针法。

代码:

class Solution {
    public void reverseString(char[] s) {
        int n = s.length;
        for (int i = 0; i < n / 2; i++) {
            char temp = s[i];
            s[i] = s[n - i - 1];
            s[n - i - 1] = temp;
        }
    }
}

//双指针
class Solution {
    public void reverseString(char[] s) {
        int l = 0;
        int r = s.length - 1;
        while (l < r) {
            char temp = s[l];
            s[l] = s[r];
            s[r] = temp;
            l++;
            r--;
        }
    }
}

541.反转字符串ll

题目:

给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。

  • 如果剩余字符少于 k 个,则将剩余字符全部反转。
  • 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

思路:

定义变量n记录剩余字符数量,定义变量start记录反转起点。每2k个字符作为一组,反转前1k个,不足1k则全部反转。

反转使用双指针法:

        指针l指向每次反转的起点start;

        指针r指向每次反转的终点,剩余字符数n>k:r=start+k-1;剩余字符数n<k:r=start+n-1。

每反转一组字符,需要重新计算剩余字符数n以及反转起点start:

        n = n - 2 * k;
        start = start + 2 * k;

若n<=0,则表示没有剩余字符了,循环结束。

代码:

class Solution {
    public String reverseStr(String s, int k) {
        char[] sc = s.toCharArray();
        int n = s.length();
        int start = 0;
        while (n > 0) {
            int l = start;
            int r = n < k ? start + n - 1 : start + k - 1;
            while (l < r) {
                char temp = sc[l];
                sc[l] = sc[r];
                sc[r] = temp;
                l++;
                r--;
            }
            n = n - 2 * k;
            start = start + 2 * k;
        }
        return new String(sc);
    }
}

卡码网54.替换数字

题目:

给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。例如,对于输入字符串"a1b2c3",函数应该将其转换为 "anumberbnumbercnumber"。

思路:

使用stringbuilder记录新字符串。

遍历字符串s的所有字符,如果字符是数字,则向stringbuilder中存入“number”;如果是小写字母,则直接将字符存入stringbuilder。

代码:

import java.util.*;
public class Main{
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (c >= '0' && c <= '9') {
                sb.append("number");
            } else {
                sb.append(c);
            }
        }
        System.out.println(sb.toString());
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值