力扣算法(Java实现)—字符串入门(9题)

news2025/1/18 17:17:11

文章目录

        • 1.反转字符串
        • 2.整数反转
        • 3.字符串中的第一个唯一字符
        • 4.有效的字母异位词
        • 5.验证回文串
        • 6.字符串转换整数 (atoi)
        • 7.实现strStr()
        • 8.外观数列
        • 9.最长公共前缀

💎💎💎💎💎

更多资源链接,欢迎访问作者gitee仓库:https://gitee.com/fanggaolei/learning-notes-warehouse/tree/master

哔哩哔哩算法题视频讲解:Java初级算法合集

1.反转字符串

  编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。

不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

示例 1:

输入:s = ["h","e","l","l","o"]
输出:["o","l","l","e","h"]

示例 2:

输入:s = ["H","a","n","n","a","h"]
输出:["h","a","n","n","a","H"]
class Solution {
    public void reverseString(char[] s) {
        int length=s.length;

        for(int i=0;i<s.length/2;i++){
            char tmp=s[i];
            s[i]=s[length-1];
            s[length-1]=tmp;
            length--;
        }
    }
}

image-20230108164331921

2.整数反转

给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。

如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。

假设环境不允许存储 64 位整数(有符号或无符号)。

示例 1:

输入:x = 123
输出:321

示例 2:

输入:x = -123
输出:-321

示例 3:

输入:x = 120
输出:21

示例 4:

输入:x = 0
输出:0
class Solution {
    public int reverse(int x) {
        long i=0;

        while(x!=0){
            i=i*10+x%10;
            x=x/10;
        }
    return (int)i==i?(int)i:0;

    }
}

image-20230108164351617

3.字符串中的第一个唯一字符

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

示例 1:

输入: s = "leetcode"
输出: 0

示例 2:

输入: s = "loveleetcode"
输出: 2

示例 3:

输入: s = "aabb"
输出: -1
class Solution {
    public int firstUniqChar(String s) {
       int[] count=new int[26];

       char[] chars=s.toCharArray();

       for(int i=0;i<s.length();i++){
           count[chars[i]-'a']++;
       }

       for(int i=0;i<s.length();i++){
           if(count[chars[i]-'a']==1){
               return i;
           }
       }
    return -1;

    }
}

image-20230108164411823

4.有效的字母异位词

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。

注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。

示例 1:

输入: s = "anagram", t = "nagaram"
输出: true

示例 2:

输入: s = "rat", t = "car"
输出: false
class Solution {
    public boolean isAnagram(String s, String t) {
        if (s.length() != t.length())
            return false;
        int[] letterCount = new int[26];
        //统计字符串s中的每个字符的数量
        for (int i = 0; i < s.length(); i++)
            letterCount[s.charAt(i) - 'a']++;
        //减去字符串t中的每个字符的数量
        for (int i = 0; i < t.length(); i++)
            letterCount[t.charAt(i) - 'a']--;
        //如果数组letterCount的每个值都是0,返回true,否则返回false
        for (int count : letterCount)
            if (count != 0)
                return false;
        return true;
    }
}

image-20230108164520690

5.验证回文串

如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。

字母和数字都属于字母数字字符。

给你一个字符串 s,如果它是 回文串 ,返回 true ;否则,返回 false

示例 1:

输入: s = "A man, a plan, a canal: Panama"
输出:true
解释:"amanaplanacanalpanama" 是回文串。

示例 2:

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

示例 3:

输入:s = " "
输出:true
解释:在移除非字母数字字符之后,s 是一个空字符串 "" 。
由于空字符串正着反着读都一样,所以是回文串。


public boolean isPalindrome(String s) {
        if (s == null || s.length() == 0)
            return true;
        s = s.toLowerCase();
        for (int i = 0, j = s.length() - 1; i < j; i++, j--) {
            while (i < j && !Character.isLetterOrDigit(s.charAt(i)))
                i++;
            while (i < j && !Character.isLetterOrDigit(s.charAt(j)))
                j--;
            if (s.charAt(i) != s.charAt(j))
                return false;
        }
        return true;
    }

image-20230109191750498

6.字符串转换整数 (atoi)

请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。

函数 myAtoi(string s) 的算法如下:

读入字符串并丢弃无用的前导空格
检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。
读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。
将前面步骤读入的这些数字转换为整数(即,“123” -> 123, “0032” -> 32)。如果没有读入数字,则整数为 0 。必要时更改符号(从步骤 2 开始)。
如果整数数超过 32 位有符号整数范围 [−231, 231 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −231 的整数应该被固定为 −231 ,大于 231 − 1 的整数应该被固定为 231 − 1 。
返回整数作为最终结果。

注意:

本题中的空白字符只包括空格字符 ’ ’ 。
除前导空格或数字后的其余字符串外,请勿忽略 任何其他字符。

示例 1:

输入:s = "42"
输出:42

解释:加粗的字符串为已经读入的字符,插入符号是当前读取的字符。

第 1 步:"42"(当前没有读入字符,因为没有前导空格)
         ^
第 2 步:"42"(当前没有读入字符,因为这里不存在 '-' 或者 '+')
         ^
第 3 步:"42"(读入 "42")
           ^
解析得到整数 42 。
由于 "42" 在范围 [-231, 231 - 1] 内,最终结果为 42 。

示例 2:

输入:s = "   -42"
输出:-42

解释:

第 1 步:"   -42"(读入前导空格,但忽视掉)
            ^
第 2 步:"   -42"(读入 '-' 字符,所以结果应该是负数)
             ^
第 3 步:"   -42"(读入 "42")
               ^
解析得到整数 -42 。
由于 "-42" 在范围 [-231, 231 - 1] 内,最终结果为 -42 。

示例 3:

输入:s = "4193 with words"
输出:4193
解释:
第 1 步:"4193 with words"(当前没有读入字符,因为没有前导空格)
         ^
第 2 步:"4193 with words"(当前没有读入字符,因为这里不存在 '-' 或者 '+')
         ^
第 3 步:"4193 with words"(读入 "4193";由于下一个字符不是一个数字,所以读入停止)
             ^
解析得到整数 4193 。
由于 "4193" 在范围 [-231, 231 - 1] 内,最终结果为 4193 。
提示:

0 <= s.length <= 200
s 由英文字母(大写和小写)、数字(0-9)、' '、'+'、'-' 和 '.' 组成
相关标签
class Solution {
    public int myAtoi(String s) {
            char[] chars = s.toCharArray();
            int length = chars.length;
            int index = 0;
            // 先去除空格
            while (index < length && chars[index] == ' '){
                index++;
            }
            // 再判断符号
            int sign =  1;
            if(chars[index] == '-' || chars[index] == '+'){
                if(chars[index] == '-'){
                    sign = -1;
                }
                index++;
            }

            int result = 0;
            int temp = 0;
            while (index < length){
                int num = chars[index] - '0';
                if(num > 9 || num < 0){
                    break;
                }
                temp = result;
                result = result * 10 + num;
                if(result/10 !=temp){
                    if(sign > 0){
                        return Integer.MAX_VALUE;
                    }else {
                        return Integer.MIN_VALUE;
                    }
                }
                index++;
            }
            return result*sign;
    }
}

image-20230109191617435

7.实现strStr()

给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1 。

示例 1:

输入:haystack = "sadbutsad", needle = "sad"
输出:0
解释:"sad" 在下标 0 和 6 处匹配。
第一个匹配项的下标是 0 ,所以返回 0 。

示例 2:

输入:haystack = "leetcode", needle = "leeto"
输出:-1
解释:"leeto" 没有在 "leetcode" 中出现,所以返回 -1 。
public int strStr(String haystack, String needle) {
        if (needle.length() == 0)
            return 0;
        int i = 0;
        int j = 0;
        while (i < haystack.length() && j < needle.length()) {
            if (haystack.charAt(i) == needle.charAt(j)) {
                i++;
                j++;
            } else {
                //如果不匹配,就回退,从第一次匹配的下一个开始,
                i = i - j + 1;
                j = 0;
            }
            if (j == needle.length())
                return i - j;
        }
        return -1;
    }

image-20230109191702275

8.外观数列

给定一个正整数 n ,输出外观数列的第 n 项。

「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。你可以将其视作是由递归公式定义的数字字符串序列:

countAndSay(1) = “1”
countAndSay(n) 是对 countAndSay(n-1) 的描述,然后转换成另一个数字字符串。
前五项如下:

1.     1
2.     11
3.     21
4.     1211
5.     111221
       第一项是数字 1 
       描述前一项,这个数是 1 即 “ 一 个 1 ”,记作 "11"
       描述前一项,这个数是 11 即 “ 二 个 1 ” ,记作 "21"
       描述前一项,这个数是 21 即 “ 一 个 2 + 一 个 1 ” ,记作 "1211"
       描述前一项,这个数是 1211 即 “ 一 个 1 + 一 个 2 + 二 个 1 ” ,记作 "111221"
       要 描述 一个数字字符串,首先要将字符串分割为 最小 数量的组,每个组都由连续的最多 相同字符 组成。然后对于每个组,先描述字符的数量,然后描述字符,形成一个描述组。要将描述转换为数字字符串,先将每组中的字符数量用数字替换,再将所有描述组连接起来。

示例 1:

输入:n = 1
输出:"1"
解释:这是一个基本样例。

示例 2:

输入:n = 4
输出:"1211"
解释:
countAndSay(1) = "1"
countAndSay(2) = 读 "1" = 一 个 1 = "11"
countAndSay(3) = 读 "11" = 二 个 1 = "21"
countAndSay(4) = 读 "21" = 一 个 2 + 一 个 1 = "12" + "11" = "1211"
class Solution {
    public String countAndSay(int n) { //4

        String res="1"; //11 21 1211

        //确定描述的次数
        for(int i=2;i<=n;i++){
            int index=0;
            StringBuilder stringBuilder=new StringBuilder();//可变的字符串

            while(index<res.length()){
                int count=1;

                while(index<res.length()-1 && res.charAt(index)==res.charAt(index+1)){
                    index++;
                    count++;
                }

                stringBuilder.append(count);
                stringBuilder.append(res.charAt(index));
                index++;
            }

        res=stringBuilder.toString();

        }
    return res;
    }
}

image-20230112210107918

9.最长公共前缀

编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 “”。

示例 1:

输入:strs = ["flower","flow","flight"]
输出:"fl"

示例 2:

输入:strs = ["dog","racecar","car"]
输出:""
解释:输入不存在公共前缀。
class Solution {
      public String longestCommonPrefix(String[] strs) {
        //边界条件判断
        if (strs == null || strs.length == 0)
            return "";
        //默认第一个字符串是他们的公共前缀
        String pre = strs[0];
        int i = 1;
        while (i < strs.length) {
            //不断的截取
            while (strs[i].indexOf(pre) != 0)
                pre = pre.substring(0, pre.length() - 1);
            i++;
        }
        return pre;
    }
}

image-20230112210055631

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/158485.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32那些事

STM32芯片型号命名方式STM32开发板的GPIO编程GPIO的函数调用顺序&#xff1a;&#xff08;1&#xff09;使能GPIO时钟&#xff1a;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);第一个参数是GPIO对象&#xff0c;第二个参数是枚举使能&#xff08;2&#xff09;初始化…

Python - 数据容器tuple(元组)

目录 定义元组 元组的相关操作 修改元组 元组的删除 转换为元组tuple 定义元组 元组同列表一样&#xff0c;都是可以封装多个、不同类型的元素在内。 但最大的不同点在于&#xff1a;元组一旦定义完成&#xff0c;就不可修改 元组定义&#xff1a;定义元组使用小括号&…

第二章.线性回归以及非线性回归—梯度下降法

第二章.线性回归以及非线性回归 2.5 梯度下降法 1.流程&#xff1a; 初始化θ0,θ1 不断改变θ0,θ1&#xff0c;直到J(θ0,θ1)到达一个全局最小值或局部极小值 2.图像分析&#xff1a; 1).图像层面分析代价函数&#xff1a; ①.红色区域表示代价函数的值比较大&#xff0…

leetcode 1443.Minimum Time to Collect All Apples in a Tree(收集苹果所需最短时间)

给出节点个数n, edges是连接的边&#xff0c;[a,b]是连接的两个顶点。 hasApple表示第 i 个顶点上是否有苹果。 走一条边需要耗时1s, 从顶点0出发&#xff0c;最后回到顶点0, 问收集所有苹果所需最短的时间。 思路&#xff1a; &#xff08;1&#xff09;DFS 可以把问题简化…

pdf文档控件Aspose.PDF for .NET 授权须知

Aspose.PDF是一款高级PDF处理API&#xff0c;可以在跨平台应用程序中轻松生成&#xff0c;修改&#xff0c;转换&#xff0c;呈现&#xff0c;保护和打印文档。无需使用Adobe Acrobat。此外&#xff0c;API提供压缩选项&#xff0c;表创建和处理&#xff0c;图形和图像功能&…

[ 解决报错篇 ] tomcat 执行 startup.bat 文件报错 -- tomcat 启动失败(安装 java 环境并配置环境变量)

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

Linux——팔 gdb部分基础知识以及操作系统的初级理解

文章目录一、gdb部分基础知识1、打断点2、逐语句过程3、监视&#xff0c;内存4、部分功能指令二、进程概念的初级理解1、冯-诺依曼体系结构2、操作系统的初级理解一、gdb部分基础知识 承接上一篇。 1、打断点 放一下全部代码 1 #include <stdio.h>2 3 int ADD(int n)4…

vs2017调试ffprobe源码

鄙人之前写过vs2017调试ffmpeg源码 现在由于需要分析视频文件里面的具体帧情况&#xff0c;需要用到ffprobe工具&#xff0c;为此本篇博客搭建vs2017工程&#xff0c;可以调试ffprobe&#xff0c;ffprobe比ffmpeg简单很多。 首先找到ffmpeg的编译目录&#xff0c;将下列三个文…

结构体内存对齐与位段详解

文章目录前言一、内存对齐1.内存对齐的规则2. 内存对齐的具体实例与运用3.为什么会有内存对齐&#xff1f;4.修改默认对齐数二、位段1.什么是位段2.位段的例子3.位段的优缺点结语前言 学习了结构体&#xff0c;你会算结构体的占用字节数吗&#xff0c;许多人恐怕摇头&#xff0…

ArcGIS分式、假分式标注

解说一下 ArcGIS中不同标注 直接标注语句分享见文后 分式标注 假分式标注 二、标注语句与视频教学 ArcGIS分数、假分数标注获取语句地址&#xff1a; ArcGIS分式、假分式标注&#xff01;标注语句直接分享 推荐学习 ArcGIS之模型构建器&#xff08;ModelBuilder&#xff0…

初级通讯录的实现详细攻略

我们设计的要求存储多少个人的信息我们使用宏&#xff0c;这样方便修改建立三个文件先从主函数入手为了持续多次&#xff0c;实现操作&#xff0c;我们利用循环&#xff0c;循环次数未知&#xff0c;我们只能选择while循环&#xff0c;do-while循环&#xff0c;我们始终要进行一…

ORB-SLAM2 --- LoopClosing::Run 回环检测线程解析

目录 1.函数作用 2.code 3.函数解析 3.1 查看是否有待处理的回环关键帧LoopClosing::CheckNewKeyFrames 3.2 检测闭环LoopClosing::DetectLoop 3.3 计算当前关键帧和上一步闭环候选帧的Sim3变换 3.4 闭环矫正 1.函数作用 回环检测&#xff0c;又称闭环检测&#xff0c…

文件操作和IO

一.文件的概念&#xff1a;狭义的文件指&#xff1a;硬盘上的文件和目录广义上的文件指&#xff1a;计算机中的很多软硬件资源路径&#xff1a;绝对路径&#xff1a;以c&#xff1a;d盘符开头的路径&#xff0c;比如c:/Intel/Logs/text.txt相对路径&#xff1a;以当前所在的目录…

Vue - 完美解决小数的四则运算(加减乘除)导致精度丢失问题,提供详细计算示例代码vue数据计算丢失精度

前言 由于 JavaScript 语言的问题,两个小数进行四则运算时,会出现各种问题,一些财务系统是必须要解决的。 本文实现了 完美修复小数计算时,计算错误、精度丢失等问题, 您可以进行任意小数的四则运算,都能保证结果是正确的。 如下图所示,使用了本文提供的方法后,可以形…

ArcGIS修改图斑时替换几何的妙用!不要只会整型要素

我们时常通过整型要素来修改要素的形状&#xff0c;但是有时候我们改变整个要素的形状、位置&#xff0c;还要保留属性不变&#xff0c;那我们就要考虑&#xff0c;高级编辑中的“替换几何”工具了。 01 替换几何原理 1 、“替换几何”工具可以为要素创建全新形状。“替换几何…

【Java】Properties类

文章目录01 初识Properties02 Properties常用方法03 Properties使用案例01 初识Properties 创建这样一个配置文件&#xff1a; 传统方法&#xff1a; public static void main(String[] args) throws IOException {//读取mysql.properties文件&#xff0c;并得到ip、user、pw…

Dubbo集群容错

Dubbo集群容错 1. 集群容错 集群调用失败时&#xff0c;Dubbo 提供的容错方案。 在集群调用失败时&#xff0c;Dubbo 提供了多种容错方案&#xff0c;缺省为 failover 重试。 各节点关系&#xff1a; 这里的 Invoker 是 Provider 的一个可调用 Service 的抽象&#xff0c;I…

n皇后(回溯)

著名的n皇后问题 即在棋盘上任意两个皇后不能在同一行&#xff0c;同一列&#xff0c;或者斜对角线&#xff0c;反斜对角线的位置 以判断&#xff08;5&#xff0c;1&#xff09;位置为例 往右下方&#xff08;斜对角线&#xff09;一连串的位置 &#xff08;5&#xff0c;1&…

Naive-UI自定义TabPane样式

前言前端开发通常使用 第三方 UI 组件库&#xff0c;像大家熟悉的 Element-UI、AntD Vue 等最近发现一个 还比较好用的 组件库 Naive-UI 传送门 &#xff0c;Vue 3 组件库&#xff0c;使用 TypeScript &#xff0c;用起来感觉还不错&#xff0c;它的主题也可以切换 &#xff08…

首款自研成像雷达发布!国产玩家赋能智能驾驶“第四类”感知

4D成像雷达赛道的“战火”正在不断升级。 高工智能汽车研究院预计&#xff0c;4D成像雷达将从2023年初开始小规模前装导入&#xff0c;预计到2024年&#xff0c;定点/搭载量有望突破百万颗&#xff0c;到2025年占全部前向毫米波雷达的比重或超过40%。 伴随着中国自动驾驶的渗…