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

       }

相关文章
|
2月前
|
Java 开发者
在 Java 中,一个类可以实现多个接口吗?
这是 Java 面向对象编程的一个重要特性,它提供了极大的灵活性和扩展性。
160 57
|
25天前
|
存储 JavaScript Java
Java 中的 String Pool 简介
本文介绍了 Java 中 String 对象及其存储机制 String Pool 的基本概念,包括字符串引用、构造方法中的内存分配、字符串文字与对象的区别、手工引用、垃圾清理、性能优化,以及 Java 9 中的压缩字符串特性。文章详细解析了 String 对象的初始化、内存使用及优化方法,帮助开发者更好地理解和使用 Java 中的字符串。
Java 中的 String Pool 简介
|
12天前
|
JSON Java Apache
Java基础-常用API-Object类
继承是面向对象编程的重要特性,允许从已有类派生新类。Java采用单继承机制,默认所有类继承自Object类。Object类提供了多个常用方法,如`clone()`用于复制对象,`equals()`判断对象是否相等,`hashCode()`计算哈希码,`toString()`返回对象的字符串表示,`wait()`、`notify()`和`notifyAll()`用于线程同步,`finalize()`在对象被垃圾回收时调用。掌握这些方法有助于更好地理解和使用Java中的对象行为。
|
1月前
|
缓存 安全 Java
java 为什么 String 在 java 中是不可变的?
本文探讨了Java中String为何设计为不可变类型,从字符串池的高效利用、哈希码缓存、支持其他对象的安全使用、增强安全性以及线程安全等方面阐述了不可变性的优势。文中还通过具体代码示例解释了这些优点的实际应用。
java 为什么 String 在 java 中是不可变的?
|
2月前
|
JSON Java 关系型数据库
Java更新数据库报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
在Java中,使用mybatis-plus更新实体类对象到mysql,其中一个字段对应数据库中json数据类型,更新时报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
118 4
Java更新数据库报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
|
25天前
|
存储 Java
Java 11 的String是如何优化存储的?
本文介绍了Java中字符串存储优化的原理和实现。通过判断字符串是否全为拉丁字符,使用`byte`代替`char`存储,以节省空间。具体实现涉及`compress`和`toBytes`方法,前者用于尝试压缩字符串,后者则按常规方式存储。代码示例展示了如何根据配置决定使用哪种存储方式。
|
2月前
|
存储 缓存 安全
java 中操作字符串都有哪些类,它们之间有什么区别
Java中操作字符串的类主要有String、StringBuilder和StringBuffer。String是不可变的,每次操作都会生成新对象;StringBuilder和StringBuffer都是可变的,但StringBuilder是非线程安全的,而StringBuffer是线程安全的,因此性能略低。
65 8
|
2月前
|
Java
在Java中如何将基本数据类型转换为String
在Java中,可使用多种方法将基本数据类型(如int、char等)转换为String:1. 使用String.valueOf()方法;2. 利用+运算符与空字符串连接;3. 对于数字类型,也可使用Integer.toString()等特定类型的方法。这些方法简单高效,适用于不同场景。
63 7
|
2月前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
63 2
|
2月前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。