IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 代码随想录算法训练营第七天 -> 正文阅读

[数据结构与算法]代码随想录算法训练营第七天

字符串

反转字符串

题目:LeetCode.344

class Solution {
    public void reverseString(char[] s) {
        int i = 0;
        int j = s.length - 1;
        while (i < j){
            char tmp = s[i];
            s[i] = s[j];
            s[j] = tmp;
            i++;
            j--;
        }
    }
}

反转字符串Ⅱ

题目:LeetCode.541

String常用API:

  • length():返回长度
  • split(String regex):分割字符串
  • toCharArray():字符串转换成字符数组
  • append:添加字符串
  • reverse():翻转字符串
  • indexOf(char c)、indexOf(String str):查找,找不到返回-1
  • equals():判断两个字符串是否相等,注意不能直接用==
  • compareTo():判断两个字符串的字典序大小,负数表示小于,0表示相等,正数表示大于
  • startsWith():判断是否以某个前缀开头
  • endsWith():判断是否以某个后缀结尾
  • trim():去掉首尾的空白字符
  • toLowerCase():全部用小写字符
  • toUpperCase():全部用大写字符
  • replace(char oldChar, char newChar):替换字符
  • replace(String oldRegex, String newRegex):替换字符串
  • substring(int beginIndex, int endIndex):返回[beginIndex, endIndex)中的子串

StringBuffer

  • append:添加字符串
  • reverse():翻转字符串
  • insert():插入
  • delete():删除

写法一:转换成字符数组

class Solution {
    public String reverseStr(String s, int k) {
        char[] ch = s.toCharArray();
        for(int i = 0; i < ch.length; i += 2 * k){
            int start = i;
            //这里是判断尾数够不够k个来取决end指针的位置
            int end = Math.min(ch.length - 1, start + k - 1);
            //用异或运算反转 
            while(start < end){
                char tmp = ch[start];
                ch[start] = ch[end];
                ch[end] = tmp;
                start++;
                end--;
            }
        }
        return new String(ch);
    }
}

写法二:StringBuffer

class Solution {
    public String reverseStr(String s, int k) {
        StringBuffer res = new StringBuffer();
        int length = s.length();
        int i = 0;
        while (i < length){
            int firstK = (i + k > length) ? length : i + k;
            int secondK = (i + (2 * k) > length) ? length : i + (2 * k);
            StringBuffer tmp = new StringBuffer();
            tmp.append(s.substring(i, firstK));//将前k个字符反转
            res.append(tmp.reverse());//反转后的前k个字符加入
            if (firstK < secondK) { //此时剩余长度一定大于k。
                res.append(s.substring(firstK, secondK));
            }
            i += (2 * k);
        }
        return res.toString();
    }
}

替换空格

题目:剑指offer.05

charAt()

class Solution {
    public String replaceSpace(String s) {
        if(s == null) return null;
        StringBuffer str = new StringBuffer();
        for(int i = 0 ; i < s.length() ; i++){
            if(s.charAt(i) == ' ') str.append("%20");
            else str.append(s.charAt(i));
        }
        return str.toString();
    }
}

反转字符串里的单词

题目:LeetCode.151

解题步骤:

  1. 去除多余的空格,先去除首尾全部空格,再去除单词间多余的空格。
  2. 定义部分反转函数
  3. 应用反转函数,先将整体反转,再将单词反转。遍历单词时采用双指针的想法start指向首字母,end向后遍历至空格处,以此时的start和end为参数反转,之后start移动end+1的位置,end++,到达最后一个单词的末尾时start==n,跳出while。
class Solution {
    public String reverseWords(String s) {
        StringBuilder res = new StringBuilder();//去除多余的空格
        int start = 0;
        int end = s.length() - 1;
        while (s.charAt(start) == ' ') start++;
        while (s.charAt(end) == ' ') end--;
        for(int i = start ; i <= end ; i++){
            if (s.charAt(i) == ' ' && s.charAt(i + 1) == ' ') continue;
            else res.append(s.charAt(i));

        }
        reverse(res, 0, res.length() - 1);// 翻转字符串
        reverseEachWord(res);// 翻转每个单词
        return res.toString();
    }


     public void reverse(StringBuilder sb, int left, int right) {
        while (left < right) {
            char tmp = sb.charAt(left);
            sb.setCharAt(left++, sb.charAt(right));
            sb.setCharAt(right--, tmp);
        }
    }

    
    public void reverseEachWord(StringBuilder sb) {
        int n = sb.length();
        int start = 0, end = 0;

        while (start < n) {
            // 循环至单词的末尾
            while (end < n && sb.charAt(end) != ' ') {
                ++end;
            }
            // 翻转单词
            reverse(sb, start, end - 1);
            // 更新start,去找下一个单词
            start = end + 1;
            end++;
        }
    }

}

左旋转字符串

题目:剑指offer.58

将上题中的局部反转的代码应用一下,先反转前n个,再反转后面剩余部分,最后整体反转,就可得到最终结果。

class Solution {
    public String reverseLeftWords(String s, int n) {
        StringBuilder res = new StringBuilder(s);
        reverse(res, 0, n - 1);
        reverse(res, n, s.length() - 1);
        reverse(res, 0, s.length() - 1);
        return res.toString();
    }
    public void reverse(StringBuilder sb, int left, int right) {
        while (left < right) {
            char tmp = sb.charAt(left);
            sb.setCharAt(left++, sb.charAt(right));
            sb.setCharAt(right--, tmp);
        }
    }
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-09-30 01:12:58  更:2022-09-30 01:17:52 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 16:49:04-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码