首页 > 其他分享 >《剑指offer》day03

《剑指offer》day03

时间:2022-10-08 15:58:22浏览次数:56  
标签:String offer day03 StringBuilder 复杂度 substring int 字符串

替换空格

题目描述

image

思路

原地修改

适用于c++这种字符串可变的语言,可以直接使用双指针法

双指针法

先将原空间扩容至结果所需大小,然后两个指针分别指向旧的和新的的尾部,往前移动,遇到需要替换的则替换后加入,否则直接加入。

从前往后的话插入未知后面的内容都会移动,时间复杂度增大,故从后往前。

主要是学双指针法的思想,适合在c++里用

遍历法

就遍历,然后替换加入到StringBuilder中,然后转成字符串返回,不允许用StringBuilder就直接加

代码实现

class Solution {
    public String replaceSpace(String s) {
        StringBuilder result=new StringBuilder();
        char[]array=s.toCharArray();
        for(int i=0;i<array.length;i++){
            //注意是字符类型,别写成字符串了
            if(array[i] ==' '){
                result.append("%20");
            }else{
                result.append(array[i]);
            }
        }
        return result.toString();
    }
}

复杂度分析

时间复杂度

O(n)

空间复杂度

O(n)

反思不足

思路

本题限制很少,怎么做都可以,主要是积累api吧

java se

String类不熟悉

  • 创建时可传入数组,起始索引,终止索引以构建字符串

    new String(arrays,0,len);
    
  • charAt方法根据索引获取字符

    s.charAt(1);
    
  • replaceAll方法根据正则表达式用目标字符串替换

    s.replaceAll(" ","%20");
    
  • toCharArray方法转换为字符数组

    s.toCharArray();
    
  • length()获取长度

  • substring获取子字符串(注意是小写s)

    s.substring(0,s.length);
    

StringBuilder类不熟悉

  • append方法追加字符串

    s.append("%20");
    

左旋转字符串

题目描述

image

思路

切片+拼接

遍历法

根据有无对StringBuilder的限制又可分为两种

使用时可以通过取余简化代码

代码实现

切片+拼接

class Solution {
    public String reverseLeftWords(String s, int n) {
        return s.substring(n,s.length())+s.substring(0,n);
    }
}

遍历法

class Solution {
    public String reverseLeftWords(String s, int n) {
        StringBuilder result=new StringBuilder();
        for(int i=n;i<s.length()+n;i++){
            result.append(s.charAt(i%s.length()));
        }
        return result.toString();
    }
}

复杂度分析

时间复杂度

切片+拼接,O(n),字符串切片函数为线性时间复杂度

遍历,O(n)

空间复杂度

均为O(n),前者是切片子字符串所致,后者是辅助空间所致

反思不足

审题

一开始还以为是交换前n个和末n个字符串的位置。

貌似没有限制的话,那些取巧的现成api是可以用的,但是其时间复杂度之类的可能不如自己设计的

标签:String,offer,day03,StringBuilder,复杂度,substring,int,字符串
From: https://www.cnblogs.com/zhouj-learn/p/16769168.html

相关文章

  • 《剑指offer》day02
    从尾到头打印链表题目要求思路逆置法由于要求以数组的形式返回,所以没法节省空间,没有此限制的话该方法的空间复杂度可达到O(1),将链表逆置再打印即可辅助栈法利用......
  • 剑指Offer-55-二叉树的深度/力扣-104-二叉树的最大深度
    intmaxDepth(TreeNode*root){ if(!root)return0; intleft=maxDepth(root->left); intright=maxDepth(root->right); //返回二叉树的深度 //只要......
  • 剑指 Offer 03. 数组中重复的数字
    力扣链接:剑指Offer03.数组中重复的数字acwing链接最初的思路是,将所有数据放入桶中,数据存在,数据桶值就++,有数据重复就retrunnums[i],无数据重复就return-1,且需......
  • 《剑指offer》day01
    用两个栈实现队列题目要求思路栈的特性是先进后出,而队列的特性是先进先出,用栈实现队列的话就需要一个辅助栈来逆置原来的栈序列。代码classCQueue{Stack<I......
  • LeetCode(剑指 Offer)- 61. 扑克牌中的顺子
    题目链接:​​点击打开链接​​题目大意:略解题思路相关企业字节跳动AC代码Java//解决方案(1)classSolution{publicbooleanisStraight(int[]nums){Set<In......
  • 剑☞offer 两个链表的第一个公共节点
    题目描述:给定两个单链表的头节点 headA 和 headB ,请找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。题目数据 保证 整个链式结构中不存......
  • Day03
    属性选择器<!DOCTYPEhtml><htmllang="en"><head>  <metacharset="UTF-8">  <title>Title</title>  <style>    .demoa{      float:......
  • day03 Jmeter授权设置
    一、BasicAuth通过验证用户名和密码才能访问资源1、添加线程组2、添加http请求请求方法get,请求路径:/basic-auth/(用户名)/(密码)3、在http下添加授权管理器,并添加参......
  • 力扣剑指offer——二叉树篇
    ✔✨前言......
  • Day03
    初识表单post和get提交<!DOCTYPEhtml><htmllang="en"><head>  <metacharset="UTF-8">  <title>表单学习</title></head><body><h1>注册</h1><!--登录注册--><!......