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

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

方法2:String的substring(效率高需掌握,常用API)


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


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


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


🍈6.最后一个单词的长度


给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中最后一个单词的长度。


单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。


题目链接:最后一个单词的长度力扣最后一个单词的长度https://leetcode-cn.com/problems/length-of-last-word/                              


         分析:这道题可以看作为第四道题的子题,我们可以考虑同样的做法,反向遍历用指针去找到最后一个字母的起始索引和结尾索引,从而求得长度。


方法:反向遍历


        时间复杂度O(n):n为字符串的长度,最多反向遍历整个字符串一遍


        空间复杂度O(1):


class Solution {
    public int lengthOfLastWord(String s) {
      //从末尾开始遍历
      int index=s.length()-1;
      //结尾有空格有往左移动
      while(s.charAt(index)==' '){
          index--;
      }
      //此时index指向最后一个单词的最后一个字母,用a记录此时的位置
      int a=index;
      //index继续移动,保证index>0
      //这里要注意index指向的是最后一个单词前面的空格
      while(index>=0&&s.charAt(index)!=' '){
          index--;
      }
      //相减获得长度
      return a-index;
    }
}


🌽7.字符串中的第一个唯一字符


给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。


题目链接:字符串中的第一个唯一字符力扣字符串中的第一个唯一字符https://leetcode-cn.com/problems/first-unique-character-in-a-string/


          题目分析:看到这个题目首先应该想到String的indexOf和lastindexOf两个API方法,其次应该想到暴力遍历的方法。效率高的方法,应该想到利用哈希,这里我们不采用map而采用数组来映射,因为数组也是哈希映射的一种体现。什么?你说你还不太会哈希或者不懂数组体现哈希?那你快看看这套哈希专题——【哈希系列】舍友担心期末考睡不着,我连夜准备了这套哈希全套专题


方法1:利用String的indexOf和lastIndexOf


          时间复杂度O(n^2):涉及到API的源码,内部也是循环实现,这个方法复杂度较高


          空间复杂度O(1)


class Solution {
    public int firstUniqChar(String s) {
        for(int i=0;i<s.length();i++){
            //indexOf获得某个元素从头遍历第一次出现的位置
            //lastIndexOf获得某个元素从尾到头遍历第一次出现的位置
            //如果相等说明这个字母就一个
            if(s.indexOf(s.charAt(i))==s.lastIndexOf(s.charAt(i))){
                return i;
            }
        }
        //没找到返回-1
        return -1;
    }
}


方法2: 利用数组哈希映射


         时间复杂度O(n):进行两次遍历,这里也可用哈希表来做,只不过使用数组的效率更好,推荐大家两种都要尝试。


         空间复杂度O(1):常数长度的数组消耗,看为O(1)的复杂度消耗    


class Solution {
    public int firstUniqChar(String s) {
        //统计26个字母出现的频率
        int[] arr=new int[26];
        //遍历一次数组统计出现的每个字母出现的次数
        for(int i=0;i<s.length();i++){
            arr[s.charAt(i)-'a']++;
        }
        //再遍历一次,找到出现次数为1的字母
        for(int i=0;i<s.length();i++){
            if(arr[s.charAt(i)-'a']==1){
                return i;
            }
        }
        return -1;
    }
}


🍋3.基础字符串处理总结(题目总链接)


     其实我们发现几乎关于字符串的每道题,都或多或少可以利用API直接或者间接求的答案,由此可见了解字符串相关API的重要性。但我们在会使用的过程中,也应该掌握其原理,如果没有这个API你也能自己用实现这个功能,这才是我们的基本功能力。在进阶的难题中,字符串的处理只是一部分,它还会搭配其他的算法,为了简化代码这时我们就应该使用API来处理。所以大家在打好基础的同时,也一定要会使用相关的API。


1.反转字符串 https://leetcode-cn.com/problems/reverse-string/

2.反转字符串ll https://leetcode-cn.com/problems/reverse-string-ii/

3.替换空格 https://leetcode-cn.com/problems/ti-huan-kong-ge-lcof/

4.反转字符串里的单词 https://leetcode-cn.com/problems/reverse-words-in-a-string/

5.左选择字符串 https://leetcode-cn.com/problems/zuo-xuan-zhuan-zi-fu-chuan-lcof/

6.最后一个单词的长度 https://leetcode-cn.com/problems/length-of-last-word/

7.字符串里第一个唯一字符 https://leetcode-cn.com/problems/first-unique-character-in-a-string/


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

热门文章

最新文章