【Java】String类OJ题

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

字符串的第一个唯一字符


题目描述:

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

示例 1:

输入: s = “leetcode”

输出: 0

示例 2:

输入: s = “loveleetcode”

输出: 2

示例 3:

输入: s = “aabb”

输出: -1

提示:

1 <= s.length <= 105

s 只包含小写字母

方法1:

程序实现的思想:将字符串转为字符数组,使用两层循环遍历查找。

具体代码如下:

public static int firstUniqChar(String s){

       char[] ch = s.toCharArray();

       for (int i = 0; i < ch.length;i++){

           int count = 0;

           for (int j = 0; j < ch.length; j++) {

               if(ch[i]==ch[j]){

                   count++;

               }

           }

           if(count == 1)

           {

               return i;

           }

       }

       return -1;

   }

外面的循环是确定以哪个字符作为比较的基准,里面的循环是以外面循环确定的字符与整个字符数组进行比较,因为比较时会和自身进行比较一次,所以count会自增,遍历完如果count等于1,它就是第一个唯一的字符,直接返回下标。

注意:

1.toCharArray可以帮助我们把字符串转化为数组。

2.在Java中,字符串不是以’\0’作为结束的标志的。因此数组名.length就是字符串的长度。

3.在处理比较长的字符串时会很慢,不推荐使用。

方法2:

代码实现思想:遍历字符串,对数组进行计数,如果数组为1就是唯一字符。

具体代码如下:

 public static int firstUniqChar(String s) {

       int[] arr = new int[26];

       for (int i = 0; i < s.length(); i++) {

           char ch = s.charAt(i);

           arr[ch - 'a']++;

       }

       for (int i = 0; i < s.length(); i++) {

           char ch = s.charAt(i);

           if (arr[ch - 'a'] == 1) {

               return i;

           }

       }

       return -1;

   }

1.charAt(int index) 返回index位置上字符

2.因为题目说了,只有小写字母,字母有26个。所以我就设置了整型数组的大小就设置了26个长度,字符在内存中存储实际上是ASCII码值,第一次循环用charAt来获得字符串的每一个字符,然后都减去’a’,范围就是0~25.让对应位置的值自增。

第二次循环是遍历的字符串,而不是数组,毕竟是要返回字符串的下标,数组的数值就是字符的数量。

方法3:

代码实现的思想:双向遍历字符串,从前往后和从后往前一起查找同一个字符,然后返回对应位置,如果位置相同,就是唯一的字符。

具体代码如下:

public static int firstUniqChar(String s) {

       for (int i = 0; i < s.length(); i++) {

           int front = s.indexOf(s.charAt(i));

           int last = s.lastIndexOf(s.charAt(i));

           if (front == last) {

               return i;

           }

       }

       return -1;

   }

indexOf(int ch) 返回ch第一次出现的位置

lastIndexOf(int ch) 从后往前找,返回ch第一次出现的位置

用charAt来获取字符串的每个字符,作为参数。


字符串最后一个单词的长度


描述:

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

输入描述:

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

输出描述:

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

示例1

输入:

hello nowcoder

输出:

8

说明:

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

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

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

示例 1:

输入: “A man, a plan, a canal: Panama”

输出: true

解释:“amanaplanacanalpanama” 是回文串

示例 2:

输入: “race a car”

输出: false

解释:“raceacar” 不是回文串

提示:

1 <= s.length <= 2 * 105

字符串 s 由 ASCII 字符组成

方法1:

程设实现的思想:它要求是在字符串中找最后一个单词,找空格,并记录后面字符串的长度。

代码实现如下:

public static void main(String[] args) {

           Scanner in = new Scanner(System.in);

           // 注意 hasNext 和 hasNextLine 的区别

           while (in.hasNextLine()) { // 注意 while 处理多个 case

               String str = in.nextLine();

               int count = 0;

               for (int i = 0; i < str.length(); i++) {

                   char ch = str.charAt(i);

                   if(ch == ' '){

                       count = 0;

               }else{

                       count++;

                   }

           }

               System.out.println(count);

       }

   }

用charAt来获取str的每一个字符,进行判断,并用count进行计数,如果遇到空格,count就会变成0,如果不是空格,count就会自增,直至循环结束并输出。

方法二:

使用库函数lastIndexOf(int ch) 从后往前找返回ch第一次出现的位置

程序实现的思想:和上一题一样,也是找空格的位置,然后使用字符串的整体长度减去空格的位置,再减一得到的就是最后一个单词的长度。

再减一是因为lastIndexOf在查找时默认第一个数是从0开始的,会比真实的位置小1。

具体代码如下:

public static void main(String[] args) {

          Scanner in = new Scanner(System.in);

          while(in.hasNextLine()){

              String str = in.nextLine();

              int count = str.lastIndexOf(' ');

              System.out.println(str.length()-count-1);

          }

      }


验证回文串


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

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

示例 1:

输入: “A man, a plan, a canal: Panama”

输出: true

解释:“amanaplanacanalpanama” 是回文串

示例 2:

输入: “race a car”

输出: false

解释:“raceacar” 不是回文串

提示:

1 <= s.length <= 2 * 105

字符串 s 由 ASCII 字符组成

这一题还是比较有难度的,先看代码后面会具体进行讲解。

具体代码如下:

public boolean LegitChar(char ch){

           if(ch >='a'&&ch <= 'z'|| ch>='0'&&ch<='9'){

               return true;

           }else{

               return false;

           }

       }

       public  boolean isPalindrome(String s){

           s = s.toLowerCase();//将字母转为小写

           int left = 0;

           int right = s.length()-1;

           while(left<right){

            //从左边找有效字符

               while(left<right && !LegitChar(s.charAt(left))){

                   left++;

               }

               //从右边找有效字符

               while(left<right && !LegitChar(s.charAt(right))){

                   right--;

               }

               if(s.charAt(left)!=s.charAt(right)){

                   return false;

               }else{

                   left++;

                   right--;

               }

           }

           return true;

       }

相关文章
|
12天前
|
Kubernetes jenkins 持续交付
从代码到k8s部署应有尽有系列-java源码之String详解
本文详细介绍了一个基于 `gitlab + jenkins + harbor + k8s` 的自动化部署环境搭建流程。其中,`gitlab` 用于代码托管和 CI,`jenkins` 负责 CD 发布,`harbor` 作为镜像仓库,而 `k8s` 则用于运行服务。文章具体介绍了每项工具的部署步骤,并提供了详细的配置信息和示例代码。此外,还特别指出中间件(如 MySQL、Redis 等)应部署在 K8s 之外,以确保服务稳定性和独立性。通过本文,读者可以学习如何在本地环境中搭建一套完整的自动化部署系统。
38 0
|
14天前
|
安全 Java API
告别繁琐编码,拥抱Java 8新特性:Stream API与Optional类助你高效编程,成就卓越开发者!
【8月更文挑战第29天】Java 8为开发者引入了多项新特性,其中Stream API和Optional类尤其值得关注。Stream API对集合操作进行了高级抽象,支持声明式的数据处理,避免了显式循环代码的编写;而Optional类则作为非空值的容器,有效减少了空指针异常的风险。通过几个实战示例,我们展示了如何利用Stream API进行过滤与转换操作,以及如何借助Optional类安全地处理可能为null的数据,从而使代码更加简洁和健壮。
44 0
|
2天前
|
Java
java的类详解
在 Java 中,类是面向对象编程的核心概念,用于定义具有相似特性和行为的对象模板。以下是类的关键特性:唯一且遵循命名规则的类名;描述对象状态的私有属性;描述对象行为的方法,包括实例方法和静态方法;用于初始化对象的构造方法;通过封装保护内部属性;通过继承扩展其他类的功能;以及通过多态增强代码灵活性。下面是一个简单的 `Person` 类示例,展示了属性、构造方法、getter 和 setter 方法及行为方法的使用。
|
6天前
|
Java API 开发者
【Java字节码操控新篇章】JDK 22类文件API预览:解锁Java底层的无限可能!
【9月更文挑战第6天】JDK 22的类文件API为Java开发者们打开了一扇通往Java底层世界的大门。通过这个API,我们可以更加深入地理解Java程序的工作原理,实现更加灵活和强大的功能。虽然目前它还处于预览版阶段,但我们已经可以预见其在未来Java开发中的重要地位。让我们共同期待Java字节码操控新篇章的到来!
|
4天前
|
Java
Java 对象和类
在Java中,**类**(Class)和**对象**(Object)是面向对象编程的基础。类是创建对象的模板,定义了属性和方法;对象是类的实例,通过`new`关键字创建,具有类定义的属性和行为。例如,`Animal`类定义了`name`和`age`属性及`eat()`、`sleep()`方法;通过`new Animal()`创建的`myAnimal`对象即可调用这些方法。面向对象编程通过类和对象模拟现实世界的实体及其关系,实现问题的结构化解决。
|
4天前
|
Java API 开发者
【Java字节码的掌控者】JDK 22类文件API:解锁Java深层次的奥秘,赋能开发者无限可能!
【9月更文挑战第8天】JDK 22类文件API的引入,为Java开发者们打开了一扇通往Java字节码操控新世界的大门。通过这个API,我们可以更加深入地理解Java程序的底层行为,实现更加高效、可靠和创新的Java应用。虽然目前它还处于预览版阶段,但我们已经可以预见其在未来Java开发中的重要地位。让我们共同期待Java字节码操控新篇章的到来,并积极探索类文件API带来的无限可能!
|
2天前
|
Java 程序员
Java编程中的对象和类: 初学者指南
【9月更文挑战第9天】在Java的世界中,对象和类构成了编程的基石。本文将引导你理解这两个概念的本质,并展示如何通过它们来构建你的程序。我们将一起探索类的定义,对象的创建,以及它们如何互动。准备好了吗?让我们开始这段Java的旅程吧!
|
8天前
|
存储 C++
C++(五)String 字符串类
本文档详细介绍了C++中的`string`类,包括定义、初始化、字符串比较及数值与字符串之间的转换方法。`string`类简化了字符串处理,提供了丰富的功能如字符串查找、比较、拼接和替换等。文档通过示例代码展示了如何使用这些功能,并介绍了如何将数值转换为字符串以及反之亦然的方法。此外,还展示了如何使用`string`数组存储和遍历多个字符串。
|
11天前
|
存储 Java
Java编程中的对象和类
在Java的世界中,“对象”与“类”是构建一切的基础。就像乐高积木一样,类定义了形状和结构,而对象则是根据这些设计拼装出来的具体作品。本篇文章【8月更文挑战第31天】 将通过一个简单的例子,展示如何从零开始创建一个类,并利用它来制作我们的第一个Java对象。准备好让你的编程之旅起飞了吗?让我们一起来探索这个神奇的过程!
|
15天前
|
缓存 安全 Java
Java String类
Java String类
13 0