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

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

方法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 数据库
面试题20: 存储过程和函数的区别
面试题20: 存储过程和函数的区别
|
3月前
|
前端开发 UED
【面试题】async/await 函数到底要不要加 try catch ?
【面试题】async/await 函数到底要不要加 try catch ?
|
3月前
|
自然语言处理 前端开发
阿里面试官:如何给所有的async函数添加try/catch?
阿里面试官:如何给所有的async函数添加try/catch?
|
2月前
|
存储 编译器 程序员
近4w字吐血整理!只要你认真看完【C++编程核心知识】分分钟吊打面试官(包含:内存、函数、引用、类与对象、文件操作)
近4w字吐血整理!只要你认真看完【C++编程核心知识】分分钟吊打面试官(包含:内存、函数、引用、类与对象、文件操作)
105 0
|
3月前
|
算法 Java C++
数据结构与算法面试题:实现一个函数 fill(int[] a, int n, int v),使其将大小为 n 的数组 a 填满为 v。
数据结构与算法面试题:实现一个函数 fill(int[] a, int n, int v),使其将大小为 n 的数组 a 填满为 v。
16 0
|
3月前
|
算法 C++
数据结构和算法面试题:实现一个函数,将一棵二叉树转换为它的镜像。(递归或者非递归实现)
数据结构和算法面试题:实现一个函数,将一棵二叉树转换为它的镜像。(递归或者非递归实现)
15 0
|
3月前
|
算法 Java C++
数据结构与算法面试题:实现一个函数,判断一个链表是否为回文链表。(提示:反转后半部分链表比对前半部分)
数据结构与算法面试题:实现一个函数,判断一个链表是否为回文链表。(提示:反转后半部分链表比对前半部分)
21 0
|
3月前
|
Java Spring 容器
面试题:怎样为组件在创建的时候指定执行一个函数,在销毁的时候也先执行一个函数
面试题:怎样为组件在创建的时候指定执行一个函数,在销毁的时候也先执行一个函数
16 0
热点面试题:箭头函数与普通函数的区别?
热点面试题:箭头函数与普通函数的区别?
|
3月前
|
前端开发 UED
【面试题】 async/await 函数到底要不要加 try catch ?
【面试题】 async/await 函数到底要不要加 try catch ?
【面试题】 async/await 函数到底要不要加 try catch ?