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

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

方法1:双指针遍历倒插(重点掌握的方法)


       首先我们把题目给的String转换为char[],还要有一个StringBuilder接收答案。通过从指针从头尾开始遍历,如果指的值为空格,均往中间移动,直到不为空格,这样就剪掉了首尾空格。因为要单词反转,所以从后面的right开始寻找单词,从right的位置,用一个index指针往左移动,找到为空格的位置停止,然后将index+1倒right的位置的单词遍历放入到StringBuilder。接着index继续移动找到不为空格的位置,然后把right更新过来,后面接着同样的操作知道完成数组的遍历得到答案。其实全程除了除去首尾空白,left都没动过,right也是靠index来更新,主要是index的移动。


      由于思路光用语言难以表达,为大家找到一篇优质图解,建议认真观看一下——双指针图解


      时间复杂度O(n):n为s的长度,只遍历了一次


      空间复杂度O(n):主要用来存储字符串,因语言而定,字符串可变的语言空间复杂度可为O(1)


class Solution {
    public String reverseWords(String s) {
        //转换为char数组
        char[] arr = s.toCharArray();
        int left = 0;
        int right = arr.length-1;
        //用来接收答案
        StringBuilder sb = new StringBuilder();
        //去掉空格
        while(arr[left]==' ') left++;
        while(arr[right] == ' ') right--;
        //注意循环结束条件
        while(left <= right){
            //index从right开始出发
            int index = right;
            //找到为空的地方停下来,这里要注意也得大于等于left,不然在走到最左边可能会数组越界
            while(index >= left && arr[index] != ' ' ) index--;
            //注意此时index是指向空格的,从inde+1到right一个个字符加入到StringBuilder中
            for(int i = index+1 ; i <= right ; i++ ) sb.append( arr[i] );
            //因为中间的单词之间需要加空格,所以index>left时,说明还在中间,我们补一个空格
            if(index > left) sb.append(' ');
            //然后我们继续移动index找到下一个单词的,这时也要保证index>=left,原理同上
            while( index >= left && arr[index]==' ' ) index--;
            //然后更新right到index
            right = index;
        }
        return sb.toString();
    }
}


方法2:API大法(虽然复杂度差不多,但其实效率比双指针低)


       时间复杂度:O(n),其中 nn 为输入字符串的长度。


       空间复杂度:O(n)O(n),用来存储字符串分割之后的结果


        上面我们讲了这道题的考点解析,如果我们都能够用API来完成这些需求,那么代码就会很简单,前提是大家要会使用和了解这些API。


       官方题解的API:


class Solution {
    public String reverseWords(String s) {
        // 除去开头和末尾的空白字符
        s = s.trim();
        // 正则匹配连续的空白字符作为分隔符分割
        List<String> wordList = Arrays.asList(s.split("\\s+"));
        //Collections带的reverse方法可以之间反转,但需要传入一个List
        Collections.reverse(wordList);
        //String.join方法很冷门,它可以在第二个参数的两两元素之间插入第一个参数
        return String.join(" ", wordList);
    }
}

我写的API法:


class Solution {
    public String reverseWords(String s) {
        //去掉首尾空格的API,需要会用
        String c=s.trim();
        //以连续的空格为切割符,这里涉及到正则表达式
        //ps:split的使用很广泛,请一定要学会
        String[] arr=c.split("\\s+");
        StringBuilder a=new StringBuilder();
        //从
        for(int i=arr.length-1;i>=0;i--){
                //从尾向头一个个单词插入
                //每次插入后补一个空格
                a.append(arr[i]+" ");                             
        }
        //最后一个单词后面不用空格,删掉最后一个
        a.deleteCharAt(a.length()-1);
        return a.toString();
    }
}


🍑5.左旋转字符串


字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。


题目链接:左旋转字符串 https://leetcode-cn.com/problems/zuo-xuan-zhuan-zi-fu-chuan-lcof/      


       题目分析:题目的要求很简单,无非就是将前n个字符移到后面即可,我们可以用StringBuilder或者StringBuffer先接收后面的字符,再接收前n个字符。


方法1:StringBuffer接收


       时间复杂度O(n):n为s的长度,遍历的耗时


       空间复杂度O(n):主要是StringBuffer的消耗


      PS:若面试要求只能用String,这里也可用String,只不过Python和Java中的String不可变,每次都要新建一个字符串且拼接的效率低,每次都要申请内存,当数据量大时效率低,且申请内存高。


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

 

相关文章
|
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题:分数到小数(模拟长除法与字符串操作详解及模拟面试问答)

热门文章

最新文章

下一篇
无影云桌面