【字符串专场】只会使用库函数?面试官气的让我出门左转(上)

简介: 字符串这东西大家无论是学习还是工作中,接触的肯定不少,平时如果对字符串处理,大家肯定都是直接使用库函数。毕竟字符串的库函数,那可是多了去了,像Java和Python这种语言,只要你能想到的操作基本都帮你封装好了。但是这就容易让人养成了不好的习惯,只会使用库函数,基础不扎实,所以打基础的时候,千万不要迷恋库函数!!为了帮助兄弟们打下较好的基础,我整理了这篇字符串处理专题训练,内容从易到难,帮助你完美过度,夯实基础,其中更附带详细解析。

🍅1.进场须知


       本章旨在为大家锻炼字符串处理的基础,在大家做题的同时,也该了解自己的语言是否含有相应的库函数,在进阶训练难题时,大家应该直接使用库函数,不然代码会非常冗余。因为进阶难题字符串的处理往往只是做题的一部分,而基础训练只需要对字符串处理。所以大家训练的时候一定也要记住是否有合适的库函数。        


🍐2.处理字符,血战力扣


🍍1.反转字符串


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


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


题目链接:反转字符串https://leetcode-cn.com/problems/reverse-string/        


          题目分析:题目的要求非常简单,就是将字符数组反转,但要求在原数组上操作,那我们就不可以new一个新的char[]数组来交换。既然如此,那我们一定要想到利用双指针,一个指向数组头部,一个指向数组尾部,交换值后,同时向内移动继续,直到两个指针相遇。


方法:双指针


         时间复杂度O(n):n为数组s的长度,一共进行了N/2次交换,常数1/2舍去,时间复杂度为O(n)


         空间复杂度O(1):只用了两个int变量,复杂度为O(1)


class Solution {
    public void reverseString(char[] s) {
        //左指针指向头部,右指针指向尾部
        int left=0;
        int right=s.length-1;
        while(left<right){
            //交换值
            exch(left,right,s);
            //两指针同时向中间移动
            left++;
            right--;
        }      
    }
    //写一个交换方法
    public void exch(int i,int j,char[] s){
        char a=s[i];
        s[i]=s[j];
        s[j]=a;
    }
}


🍠2.反转字符串||


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


如果剩余字符少于 k 个,则将剩余字符全部反转。

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


题目链接:反转字符串||https://leetcode-cn.com/problems/reverse-string-ii/        


           题目解析:这道题是第一题的进阶,难点在于要知道合适的反转范围,我们用指针l和指针r来每次找到需要反转的范围。尤其是注意在最后,r是直接在l的基础上+k-1,有可能超出数组长度,所以每次需要在r和n-1之间取小值。这道题l和r的下标,建议画个图理解,不要光靠脑子想象,这是大忌。


方法:双指针


          时间复杂度O(n):n为s的长度。


          空间复杂度O(1)或O(n):这取决于你的语言,像Java中的String不可变,我们只能用一个char数组取修改,如果你的语言字符串可修改,可在原数组操作即可,这时时间复杂度就是O(1)。        


class Solution {
    public String reverseStr(String s, int k) {
        char[] arr=s.toCharArray();
        int n=arr.length;
        //l指针每次+2k
        for(int l=0;l<n;l=l+2*k){
            //r每次在l的基础上+k-1(因为找的是下标,建议画个图写出下标理解一下)
            int r=l+k-1;
            //如果r超出了数组长度,这时r就比n-1大了,我们只取到n-1即可
            reverse(arr,l,Math.min(n-1,r));
        }
        return String.valueOf(arr);
    }
    //写一个反转方法,反转char[]数组指定的索引区间
    public void reverse(char[] arr,int i,int j){
        while(i<j){
            char a=arr[i];
            arr[i++]=arr[j];
            arr[j--]=a;
        }
    }
}


🍌3.替换空格



请实现一个函数,把字符串 s 中的每个空格替换成"%20"。


题目链接:替换空格https://leetcode-cn.com/problems/ti-huan-kong-ge-lcof/      


            题目分析:由于是字符串,有些语言的字符串是可修改的,某些语言的字符串是不可修改的,像Java的String是不可修改的。所以这里我们用StringBuilder,当然StringBuffer也可,两者都是可修改的字符串类,但是StringBuilder的效率更高。我们遍历题目给的String,如果不是空格,之间在StringBuilder后加上相同的,如果是空格,就加上%20,最后把StringBuilder转换为String返回即可。


方法: 利用可变字符串(这里也可用字符串数组),遍历相加      


           时间复杂度O(n):n为字符串的长度,主要是遍历的耗时


           空间复杂度O(n):主要是创建了StringBuilder对象,长度最长可能为3n。


class Solution {
    public String replaceSpace(String s) {
        StringBuilder arr=new StringBuilder();
        for(int i=0;i<s.length();i++){
            //是空格就加上%20
            if(s.charAt(i)==' '){
                arr.append("%20");
            }else{
                //不是空格就之间加到arr末尾
                arr.append(s.charAt(i));
            }
        }
        //返回String形式
        return arr.toString();
    }
}


🍐4.翻转字符串里的单词(中等)


给你一个字符串 s ,逐个翻转字符串中的所有 单词 。


单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。


请你返回一个翻转 s 中单词顺序并用单个空格相连的字符串。


说明:


输入字符串 s 可以在前面、后面或者单词间包含多余的空格。

翻转后单词间应当仅用一个空格分隔。

翻转后的字符串中不应包含额外的空格。


题目链接:翻转字符串里的单词https://leetcode-cn.com/problems/reverse-words-in-a-string/        


         题目分析:这道题在字符串里算是较有难度的一题,因为它几乎考察了所有的字符串处理操作,想要效率高的完成,还是比较难的,即使是用API,很多人也无从下手,但是这也让我们了解了更多API的使用操作,是一道非常好的题。下面我为大家讲解多种方法以及它们的效率如何。


       ❗️考点解析:1.如何修剪掉两端空格


                           2.如何把单词反转过来


                           3.如何跳过中间连续的空格


相关文章
|
23天前
|
SQL Oracle 关系型数据库
[Oracle]面试官:你举例几个内置函数,并且说说如何使用内置函数作正则匹配
本文介绍了多种SQL内置函数,包括单行函数、非空判断函数、日期函数和正则表达式相关函数。每种函数都有详细的参数说明和使用示例,帮助读者更好地理解和应用这些函数。文章强调了字符串操作、数值处理、日期计算和正则表达式的使用方法,并提供了丰富的示例代码。作者建议读者通过自测来巩固学习成果。
16 1
[Oracle]面试官:你举例几个内置函数,并且说说如何使用内置函数作正则匹配
|
4月前
|
机器学习/深度学习
【机器学习】如何判断函数凸或非凸?(面试回答)
文章介绍了如何判断函数是凸函数还是非凸函数,包括凸函数的定义、几何意义、判定方法(一元函数通过二阶导数判断,多元函数通过Hessian矩阵的正定性判断),以及凸优化的概念和一些经典的凸优化问题。
184 1
【机器学习】如何判断函数凸或非凸?(面试回答)
|
4月前
|
安全 Java 编译器
【Java基础面试二十九】、说一说你对字符串拼接的理解
这篇文章讨论了Java中字符串拼接的四种常用方式(使用`+`运算符、`StringBuilder`、`StringBuffer`和`String`类的`concat`方法),每种方式适用的场景,以及在不同情况下的性能考量。
|
4月前
|
Java
【Java基础面试二十八】、使用字符串时,new和““推荐使用哪种方式?
这篇文章讨论了在Java中使用字符串时,推荐使用双引号`""`直接量方式而不是使用`new`操作符,因为`new`会在常量池之外额外创建一个对象,导致更多的内存占用。
|
4月前
|
JavaScript
【Vue面试题八】、为什么data属性是一个函数而不是一个对象?
这篇文章解释了为什么在Vue中组件的`data`属性必须是一个函数而不是一个对象。原因在于组件可能会有多个实例,如果`data`是一个对象,那么这些实例将会共享同一个`data`对象,导致数据污染。而当`data`是一个函数时,每次创建组件实例都会返回一个新的`data`对象,从而确保了数据的隔离。文章通过示例和源码分析,展示了Vue初始化`data`的过程和组件选项合并的原理,最终得出结论:根实例的`data`可以是对象或函数,而组件实例的`data`必须为函数。
【Vue面试题八】、为什么data属性是一个函数而不是一个对象?
|
5月前
|
安全 Android开发 Kotlin
Android经典面试题之Kotlin中常见作用域函数
**Kotlin作用域函数概览**: `let`, `run`, `with`, `apply`, `also`. `let`安全调用并返回结果; `run`在上下文中执行代码并返回结果; `with`执行代码块,返回结果; `apply`配置对象后返回自身; `also`附加操作后返回自身
62 8
|
4月前
|
安全 编译器 C++
【剑指offer】2.2编程语言(p22-p25)——面试题1:string赋值运算函数
【剑指offer】2.2编程语言(p22-p25)——面试题1:string赋值运算函数
|
5月前
|
Android开发 Kotlin
Android面试题之kotlin中怎么限制一个函数参数的取值范围和取值类型等
在Kotlin中,限制函数参数可通过类型系统、泛型、条件检查、数据类、密封类和注解实现。例如,使用枚举限制参数为特定值,泛型约束确保参数为Number子类,条件检查如`require`确保参数在特定范围内,数据类封装可添加验证,密封类限制为一组预定义值,注解结合第三方库如Bean Validation进行校验。
81 6
|
5月前
|
存储 安全 Java
Java面试题:请解释Java中的字符串和字符串缓冲区?
Java面试题:请解释Java中的字符串和字符串缓冲区?
34 0
|
6月前
|
存储 算法 数据挖掘
深入解析力扣166题:分数到小数(模拟长除法与字符串操作详解及模拟面试问答)
深入解析力扣166题:分数到小数(模拟长除法与字符串操作详解及模拟面试问答)

热门文章

最新文章

下一篇
无影云桌面