【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;

       }

相关文章
|
17天前
|
存储 安全 Java
java.util的Collections类
Collections 类位于 java.util 包下,提供了许多有用的对象和方法,来简化java中集合的创建、处理和多线程管理。掌握此类将非常有助于提升开发效率和维护代码的简洁性,同时对于程序的稳定性和安全性有大有帮助。
40 17
|
8天前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
12天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
53 4
|
13天前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
31 2
|
18天前
|
存储 安全 Java
如何保证 Java 类文件的安全性?
Java类文件的安全性可以通过多种方式保障,如使用数字签名验证类文件的完整性和来源,利用安全管理器和安全策略限制类文件的权限,以及通过加密技术保护类文件在传输过程中的安全。
|
22天前
|
Java 数据格式 索引
使用 Java 字节码工具检查类文件完整性的原理是什么
Java字节码工具通过解析和分析类文件的字节码,检查其结构和内容是否符合Java虚拟机规范,确保类文件的完整性和合法性,防止恶意代码或损坏的类文件影响程序运行。
|
22天前
|
Java API Maven
如何使用 Java 字节码工具检查类文件的完整性
本文介绍如何利用Java字节码工具来检测类文件的完整性和有效性,确保类文件未被篡改或损坏,适用于开发和维护阶段的代码质量控制。
|
21天前
|
存储 Java 编译器
java wrapper是什么类
【10月更文挑战第16天】
23 3
|
24天前
|
Java 程序员 测试技术
Java|让 JUnit4 测试类自动注入 logger 和被测 Service
本文介绍如何通过自定义 IDEA 的 JUnit4 Test Class 模板,实现生成测试类时自动注入 logger 和被测 Service。
22 5
|
25天前
|
Java
在Java多线程编程中,实现Runnable接口通常优于继承Thread类
【10月更文挑战第20天】在Java多线程编程中,实现Runnable接口通常优于继承Thread类。原因包括:1) Java只支持单继承,实现接口不受此限制;2) Runnable接口便于代码复用和线程池管理;3) 分离任务与线程,提高灵活性。因此,实现Runnable接口是更佳选择。
33 2

热门文章

最新文章