• 牛客网——Java刷题篇


    ced485cbb11e458d81a746890b32cf3f.gif

    作者:敲代码の流川枫

    博客主页:流川枫的博客

    专栏:和我一起学java

    语录:Stay hungry stay foolish

    工欲善其事必先利其器,给大家介绍一款超牛的斩获大厂offer利器——牛客网

    点击免费注册和我一起刷题吧   

    文章目录

    1. 检测字符串是否为回文

    2. 最后一个单词的长度

    3. 第一个只出现一次的字符


    1. 检测字符串是否为回文

    给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。

    说明:本题中,我们将空字符串定义为有效的回文串。

    示例 1:

    输入: "A man, a plan, a canal: Panama"
    输出: true
    解释:"amanaplanacanalpanama" 是回文串
    示例 2:

    输入: "race a car"
    输出: false
    解释:"raceacar" 不是回文串

    提示:

    1 <= s.length <= 2 * 105
    字符串 s 由 ASCII 字符组成

    解题思路

    验证回文串一般解法都是双指针,而且是使用头尾指针,头指针指向字符串的第一个元素,尾指针指向字符串的最后一个元素,从字符串两端往中间遍历和比较。本题的关键在于字符串是由 ASCII 字符组成,而我们验证时只需要考虑字母和数字字符,因此要把其他字符过滤掉

    题解: 

    1. class Solution {
    2. public boolean isPalindrome(String s) {
    3. // 左指针
    4. int left = 0;
    5. // 右指针
    6. int right = s.length() - 1;
    7. // 左右指针分别从前和从后往中间移动
    8. while (left < right) {
    9. char c1 = s.charAt(left);
    10. char c2 = s.charAt(right);
    11. if (!Character.isLetterOrDigit(c1)) {
    12. // 过滤掉非字母和数字字符
    13. left++;
    14. continue;
    15. }
    16. if (!Character.isLetterOrDigit(c2)) {
    17. // 过滤掉非字母和数字字符
    18. right--;
    19. continue;
    20. }
    21. // 忽略字母大小写
    22. if (Character.toLowerCase(c1) != Character.toLowerCase(c2)) {
    23. return false;
    24. }
    25. // 挪动指针
    26. left++;
    27. right--;
    28. }
    29. return true;
    30. }
    31. }

    2. 最后一个单词的长度

    计算字符串最后一个单词的长度,单词以空格隔开,字符串长度小于5000。(注:字符串末尾不以空格为结尾)

    输入描述:

    输入一行,代表要计算的字符串,非空,长度小于5000。

    输出描述:

    输出一个整数,表示输入字符串最后一个单词的长度。

    示例1

    输入:hello nowcoder

    输出:8

    说明:最后一个单词为nowcoder,长度为8

    方法一(指针)

    解题思路

    定义一个指针变量。

    从后往前遍历字符串,当遇到空格时,用指针记录位置信息,并终止循环。

    总长度减去指针到开头一段的长度,即得到最后一个单词的长度。

    题解: 

    1. import java.util.Scanner;
    2. public class Main{
    3. public static void main(String[] args){
    4. //标准输入
    5. Scanner sc=new Scanner(System.in);
    6. //键盘输入字符串
    7. String s=sc.nextLine();
    8. //定义指针变量
    9. int index=-1;
    10. for(int i=s.length()-1;i>=0;i--){
    11. //从后往前第一个空格的位置
    12. if(s.charAt(i)==' '){
    13. index=i;
    14. break;
    15. }
    16. }
    17. //总长度减去指针到开头一段的长度,即得到最后一个单词的长度
    18. System.out.println(s.length()-index-1);
    19. }
    20. }

    时间复杂度:最坏情况下遍历整个字符串,所以时间复杂度为O(n)O(n)O(n)。

    空间复杂度:需要额外常数级别的空间,所以空间复杂度为O(1)O(1)O(1)。

    方法二(字符串分割)

    解题思路

    通过split函数将原字符串分割为字符串数组。

    字符串数组最后一个元素即是原字符串的最后一个单词,直接输出其长度。

    题解: 

    1. import java.util.Scanner;
    2. public class Main{
    3. public static void main(String[] args){
    4. //标准输入
    5. Scanner sc=new Scanner(System.in);
    6. //键盘输入字符串
    7. String s=sc.nextLine();
    8. //以空格分割为字符串数组
    9. String[] arr=s.split(" ");
    10. //字符串数组最后一个元素即是原字符串的最后一个单词,直接输出其长度
    11. System.out.println(arr[arr.length-1].length());
    12. }
    13. }

    时间复杂度:字符串分割需要遍历整个字符串,所以时间复杂度为O(n)O(n)O(n)

    空间复杂度:最坏情况下需要大小为n-1的字符串数组存储所有的单词,所以空间复杂度为O(n)O(n)O(n)

    3. 第一个只出现一次的字符

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

    示例 1:

    输入: s = "leetcode"
    输出: 0
    示例 2:

    输入: s = "loveleetcode"
    输出: 2
    示例 3:

    输入: s = "aabb"
    输出: -1

    提示:

    • 1 <= s.length <= 105
    • s 只包含小写字母

    解题思路

    1.统计各个字符出现次数

    定义一个计数数组count[],遍历字符数组,如果字符出现多次,则count++

    2.重新遍历字符数组

    重新遍历一次 字符数组,如果发现「它」只出现一次,直接返回对应的下标,否则循环终止之后返回 -1

    题解:

    1. public int firstUniqChar(String s){
    2. int[] count = new int[26];
    3. for (int i = 0; i < s.length(); i++) {
    4. char ch = s.charAt(i);
    5. count[ch-'a'] ++;
    6. }
    7. for (int i = 0; i < s.length(); i++) {
    8. char ch = s.charAt(i);
    9. if(count[ch-'a'] == 1){
    10. return i;
    11. }
    12. }
    13. return -1;
    14. }

    “ 本期的分享就到这里了, 记得给博主一个三连哈,你的支持是我创作的最大动力!

    ced485cbb11e458d81a746890b32cf3f.gif

  • 相关阅读:
    python代码实现论文〖文献引用顺序〗修改校对
    解决jupyter打开的默认路径问题
    【Web安全】点击劫持漏洞
    智慧气象解决方案-最新全套文件
    HJ61 放苹果
    (Java高级教程)第三章Java网络编程-第七节3:Cookie和Session
    双重for循环嵌套--c语言
    猫罐头哪个牌子好?盘点十大猫罐头品牌排行榜!
    JavaScript 基础
    深度学习验证码项目
  • 原文地址:https://blog.csdn.net/chenchenchencl/article/details/126388369