JAVA刷题之字符串的一些个人思路

news2025/1/18 8:55:15

感谢您的阅读!

꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱
ʕ̯•͡˔•̯᷅ʔ大家好,我是xiaoxie.希望你看完之后,有不足之处请多多谅解,让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客
本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如需转载还请通知˶⍤⃝˶
个人主页:xiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客
系列专栏:xiaoxie的刷题系列专栏——CSDN博客●'ᴗ'σσணღ*
我的目标:"团团等我💪( ◡̀_◡́ ҂)" 

( ⸝⸝⸝›ᴥ‹⸝⸝⸝ )欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​+关注(互三必回)!

一.把字符串转换成整数

1.首先我们看到这一题我们可以注意到字符串的数据范围为0<= n <=100 所以我们要先考虑好边界问题

 如果字符串为空,或者是字符串的长度为0 我们就return 0
if (str == null || str.length() == 0) {
            return 0;
        }

2.现在我们来到第二步,可以看出题目的意思为除了+ - 以外的符号时直接输出0,出现了判断的问题,所以我们要把字符串给转换成char 数组的形式这样子转换成数组的形式更好对字符串的元素进行操作

//使用库函数把字符串转换成数组的形式
char[] ch = str.toCharArray();

3.我们现在来到第三步可以看到题目的注意:字符串中可能出现 +/- 且仅可能出现在字符串首位

我们就可以先对字符串数组的第一个元素也就是char[0]判断一下是否为   -  

        int a = 1;//如果数组的第一个元素判断为符号 - 就赋值为 -1 
        int b = 0;//如果数组的第一个元素判断为符号 +/- 就加一 数组就从下标为1的时候开始判断
        if (ch[0] == '+') {
            b = 1;
        }else if (ch[0] == '-') {
            b = 1;
            a = -1;
        }

4.我们使用for循环来判断数组的元素是否为非数字

       int result = 0;
        for (int i = b; i < ch.length; i++) {
          // 判断当前字符是否为数字,如果不是,则返回0 
            if (!Character.isDigit(ch[i])) {
                return 0;
            }
            int digit = ch[i] - '0';// 通过将字符减去字符'0'得到对应的数字
            result =result*10 + digit;// 将当前数字添加到结果中,乘以10表示将当前数字放在个位上 
        }
        return a * result;
    }

总体的代码

import java.util.*;
public class Solution {
    public int StrToInt(String str) {
        if (str == null || str.length() == 0) {
            return 0;
        }
        char[] ch = str.toCharArray();
        int a = 1;
        int b = 0;
        if (ch[0] == '+') {
            b = 1;
        }else if (ch[0] == '-') {
            b = 1;
            a = -1;
        }
        int result = 0;
        for (int i = b; i < ch.length; i++) {
            if (!Character.isDigit(ch[i])) {
                return 0;
            }
            int digit = ch[i] - '0';
            result =result*10 + digit;
        }
        return a * result;
    }
}

二..
字符串相加

首先我们可以从下图看到例如字符串“12345” 和“12”是如何相加的

我们可以看出两个字符串相加是从num1的最后一个元素和num2的最后一个元素开始相加的,那么我们就有这样一个思路,先把两个字符串转换成数组的形式,然后让它们的最后一个元素开始相加,在设一个参数carry,如果相加大于9,Carry就加一否则就为0,然后使StringBuilder.append(),把数组元素添加进行添加,需要注意的是因为是从尾部开始添加,所以我们还需要逆置,以上就这个题总体思路了现在我们进行分步讲解

1.根据上文已知的思路,我们要从尾部开始,那我们是不是需要获取到它们尾部的下标,以及我们还需要创建一个参数来表示两数相加后的进位carry 所以可以得出以下代码:

int i = num1.length()-1;
int j = num2.length()-1;
int carry = 0;//进位

2.因为需要用到 StringBuilder.append(),和 StringBuilder.reverse()方法所以我们需创建 StringBuilder对象

 StringBuilder s = new  StringBuilder();

3.因为需要转换成数组的形式所以有以下代码

char[] ch1 = num1.toCharArray();
char[] ch2 = num2.toCharArray();

 4.好前期的一些参数准备我们都设立好了,现在让我们开始解决本题的关键步骤,让两个数组的尾部元素相加,直到进位数为0,或者其中一位数组的元素加完了。结合上文思路可以得出以下代码,(如果看不懂这段代码博主建议自己画一下两数相加的图,然后结合博主的思路以及下文代码的注释,多看几遍,相信聪明的你肯定可以解决):

//这里加个carry != 0 的条件是为了确保两个数组的所有个数字的所有位都已经相加完毕,但如果还有进位的话,也要继续将进位加到结果中。

while(i >= 0 || j>= 0 || carry!= 0) {
int x = ch1[i] < 0 ? 0:ch1[i--]-'0';
//这里只有数组的长度不为0就获取到数组i下标的元素,为什么要减‘0’,因为字符数组的元素数字为ASC11值所以为了得到整数我们需要减去零的ASC11值就可以得到整数了,i--是因为只要数组的长度不为0就移到下一位

int y = ch2[j] < 0 ? 0:ch2[j--] - '0';
//同理

int sum = x+y+carry;
//求得两数相加的值

s.append(sum % 10)
//将 sum 的个位数加入到 StringBuilder s 的末尾。因为两个数相加后可能会产生进位,所以只将个位数加入到结果中,而十位数则要在下一次循环中加上。sum % 10 可以得到 sum 的个位数,比如 sum 为 15,则 sum % 10 的结果为 5。

carry = sum/10;
//得到两数相加后的进位
}

5.需要特别注意的一点是使用s.append()后是字符串是为逆置的,所以我们需要逆转字符串所以可以得到以下代码:

return s.reverse().toString//因为题目要求的是返回字符串所以我们需要使用s.toString

6.以下为完整代码

class Solution {
    public String addStrings(String num1, String num2) {
        int i = num1.length()-1;
        int j = num2.length()-1;
        int carry = 0;
        StringBuilder s = new StringBuilder();
        char[] ch1 = num1.toCharArray();
        char[] ch2 = num2.toCharArray();
        while(i >= 0 || j >= 0 || carry != 0) {
            int x = i < 0 ? 0 : ch1[i--] - '0';
            int y = j < 0 ? 0 : ch2[j--] - '0';
            int sum = x+y+carry;
            s.append(sum % 10);
            carry = sum / 10;
        }
        return s.reverse().toString();
    }
}

这个方法的执行用时,及内存分布 

二.1字符串相加扩展:

博主做完这道题,又自己给自己做了一个假设,如果两个数可以为负数该如何解呢

public class Solution {
    public String addStrings(String num1, String num2) {
        boolean isNegative1 = num1.charAt(0) == '-';
        boolean isNegative2 = num2.charAt(0) == '-';

        // 去掉负号
        num1 = isNegative1 ? num1.substring(1) : num1;
        num2 = isNegative2 ? num2.substring(1) : num2;
        int i = num1.length() - 1;
        int j = num2.length() - 1;
        StringBuilder result = new StringBuilder();
        int carry = 0;
        while (i >= 0 || j >= 0) {
            int n1 = i >= 0 ? num1.charAt(i--) - '0' : 0;
            int n2 = j >= 0 ? num2.charAt(j--) - '0' : 0;
            int sum = n1 + n2 + carry;
            carry = sum / 10;
            result.append(sum % 10);
        }

        if (carry > 0) {
            result.append(carry);
        }

        boolean isNegativeResult = false;
        if ((isNegative1 && !isNegative2) || (!isNegative1 && isNegative2)) {
            // 如果两个数的符号不同,则结果的符号与数值大的那个相同
            isNegativeResult = num1.length() < num2.length();
        } else if (isNegative1 && isNegative2) {
            // 如果两个数都是负数,则结果的符号与绝对值小的那个相同
            int absNum1 = Integer.parseInt(num1);
            int absNum2 = Integer.parseInt(num2);
            isNegativeResult = absNum1 > absNum2;
        }
        return isNegativeResult ? "-" + result.toString() : result.toString();
    }
}

如果你有更好的解法也可以私信博主哦,大家一起讨论 

三.验证回文串

还是和前面几题一样我们先确定自己的总体思路:首先比较字符串是否回文,我们了可以设定头部元素和尾部元素,进行动态移动然后比较是否相等,因为要忽视非字母数字字符,我们可以用到Character.isisLetterOrDigit 方法这样使用while循环直到头部指针等于尾部指针,就证明字符串回文了,以上就是本体的总体思路了,现在博主为大家分布讲解

1.根据上文已知的思路,我们需要取得头部部分和尾部部分

 int start = 0;
 int end = s.length()-1;

2.根据上文思路我们需要写一个while循环,动态移动头部和尾部

 while(start < end){
            char chS = s.charAt(start);
            char chE = s.charAt(end);
            //头部指针指向的元素不为字母或者是数字就往后移动
            if(!Character.isLetterOrDigit(chS)){
                start++;
            }
            //尾部指针指向的元素不为字母或者是数字就往前移动
            else if(!Character.isLetterOrDigit(chE)){
                end--;
            }
            //先把字母转换成小写后比较如果不相等就返回false
            else if(Character.toLowerCase(chS)!=Character.toLowerCase(chE)){
                return false;
            }
            //如果相等就动态移动
            else{
                start++;
                end--;
            }
   }
//如果头部指针等于尾部指针就说明这个字符串以及遍历完成了,形成回文 返回true
        return true;

3.总体代码

class Solution {
    public boolean isPalindrome(String s) {
        int start = 0;
        int end = s.length()-1;
        while(start < end){
            char chS = s.charAt(start);
            char chE = s.charAt(end);
            if(!Character.isLetterOrDigit(chS)){
                start++;
            }
            else if(!Character.isLetterOrDigit(chE)){
                end--;
            }
            else if(Character.toLowerCase(chS)!=Character.toLowerCase(chE)){
                return false;
            }
            else{
                start++;
                end--;
            }
        }
        return true;
    }
}

这个方法的执行用时,及内存分布

四.说明

以上就是博主关于String 的刷题了,用于博主也才刚开始学习Java,所以可能有些地方的解法不是最优解,还有很大的进步空间,希望看完之后可以对你可以有一点小启发,当然如果你有更好的解法或者是有什么不太明白的地方也可以私信博主,博主很期待和你一起加油一起成长。 

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

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

相关文章

【Spring总结】基于配置的方式来写Spring

本篇文章是对这两天所学的内容做一个总结&#xff0c;涵盖我这两天写的所有笔记&#xff1a; 【Spring】 Spring中的IoC&#xff08;控制反转&#xff09;【Spring】Spring中的DI&#xff08;依赖注入&#xff09;Dependence Import【Spring】bean的基础配置【Spring】bean的实…

计算机msvcr120.dll丢失的解决方法,分享多种亲测可靠的方法

在使用计算机的过程中&#xff0c;我们有时可能会遇到一些技术问题&#xff0c;其中之一就是提示丢失msvcr120.dll文件。当计算机提示丢失msvcr120.dll文件时&#xff0c;可能是由于某些程序无法找到这个文件&#xff0c;从而导致程序无法正常运行。那么我们需要如何解决修复好…

一文读懂:testcafe框架和页面元素交互

一、互动要求 使用 TestCafe 与元素进行交互操作&#xff0c;元素需满足以下条件&#xff1a;☟ 元素在 body 页面窗口或 iframe 窗口的元素内。如果某个元素在视口之外&#xff0c;则 TestCafe 通过滚动可以滚动到元素可见。 元素是可见的&#xff0c;具有以下属性&#…

Leetcode—剑指OfferII LCR 022.环形链表II【中等】

2023每日刷题&#xff08;三十三&#xff09; Leetcode—LCR 022.环形链表II 算法思想 参考k神的博客 实现代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode *detectCycle(struct List…

2.3 调用智谱 API

调用智谱 API 1 申请调用权限2 调用智谱 AI API3 使用 LangChain 调用智谱 AI参考&#xff1a; 智谱 AI 是由清华大学计算机系技术成果转化而来的公司&#xff0c;致力于打造新一代认知智能通用模型。公司合作研发了双语千亿级超大规模预训练模型 GLM-130B&#xff0c;并构建了…

Python------列表 集合 字典 推导式(本文以 集合为主)

推导式&#xff1a; 推导式comprehensions&#xff08;又称解析式&#xff09;&#xff0c;是Python的一种独有特性。推导式是可以从一个数据序列 构建 另一个 新的数据序列&#xff08;一个有规律的列表或控制一个有规律列表&#xff09;的结构体。 共有三种推导&#xff…

HUAWEI华为笔记本MateBook X 2021款i5集显(EULD-WFH9,WXX9)原装出厂Windows11系统工厂模式包

下载链接&#xff1a;https://pan.baidu.com/s/1gQ_O203SSm83Nc-zDk1iNA?pwd4exz 提取码&#xff1a;4exz 系统带F10一键智能还原功能隐藏恢复分区、所有驱动、Office办公软件、华为电脑管家等预装程序 所需要工具&#xff1a;32G或以上的U盘 文件格式&#xff1a;zip …

TensorRt推理加速框架Python API服务器部署教程以及运行Helloworld程序

一、确认cuda工具包和n卡相关驱动是否安装 在终端中输入以下命令&#xff1a; nvcc -V如果出现以下提示&#xff0c;则已经成功安装 在终端中输入以下命令&#xff1a; nvidia-smi如果出现即为成功&#xff0c;我在这里就不去介绍怎么下载cuda和驱动怎么下载了&#xff0c;…

【Linux系统化学习】进程的父子关系 | fork 进程

个人主页点击直达&#xff1a;小白不是程序媛 Linux专栏&#xff1a;Linux系统化学习 目录 前言&#xff1a; 父子进程 父子进程的引入 查看父子进程 查询进程的动态目录 更改进程的工作目录 fork创建进程 fork的引入 fork的使用 fork的原理 fork如何实现的&#…

2023-2024华为ICT大赛-计算赛道-广东省省赛初赛-高职组-部分赛题分析【2023.11.18】

2023-2024华为ICT大赛 计算赛道 广东省 省赛 初赛 高职组 部分赛题 分析【2023.11.18】 文章目录 单选题tpcds模式中存在表customer&#xff0c;不能成功删除tpcds模式是&#xff08; &#xff09;以下哪个函数将圆转换成矩形&#xff08; &#xff09;下列哪个选项表示依赖该D…

一键云端,AList 整合多网盘,轻松管理文件多元共享!

hello&#xff0c;我是小索奇&#xff0c;本篇教大家如何使用AList实现网盘挂载 可能还是有小伙伴不懂&#xff0c;所以简单介绍一下哈 AList 是一款强大的文件管理工具&#xff0c;为用户提供了将多种云存储服务和文件共享协议集成在一个平台上的便利性。它的独特之处在于&am…

cesium雷达效果(脉冲圆)

cesium雷达效果(脉冲圆) 下面富有源码 实现思路 使用ellipse方法加载圆型,修改ellipse中‘material’方法重写glsl来实现当前效果 示例代码 index.html <!DOCTYPE html> <html lang="en"><head>

Typora——优雅的排版也是一种品味

电脑中用于编辑文本的软件&#xff0c;一直以来可谓是层出不穷&#xff0c;大家脑海中一定会浮现出很多名字&#xff1a;word&#xff0c;OneNote&#xff0c;记事本&#xff0c;wps&#xff0c;LaTeX&#xff0c;还有各种小众的office工具&#xff0c;等等等等。今天学长将介绍…

java回调函数

在java中是存在回调函数的&#xff0c;我们可以把回调函数理解为一个被作为参数传递的函数。 类似于&#xff0c;我可以设置一个功能给系统&#xff0c;但是只有特定时候才会触发&#xff0c;触发的时候就会把函数作为参数的形式传递到另外的函数中。一般都是使用系统中写好的…

科研学习|科研软件——面板数据、截面数据、时间序列数据的区别是什么?

一、数据采集方式不同 面板数据是通过在多个时间点上对同一组体进行观测而获得的数据。面板数据可以是横向面板数据&#xff0c;即对同一时间点上不同个体的观测&#xff0c;也可以是纵向面板数据&#xff0c;即对同一个体在不同时间点上的观测。采集面板数据需要跟踪相同的个体…

文章分类列表进行查询(实体类日期格式设置)

categoryController GetMappingpublic Result<List<Category>> list(){List<Category> cs categoryService.list();return Result.success(cs);} categoryService //列表查询List<Category> list(); categoryServiceImpl Overridepublic List<Cat…

深度学习交通车辆流量分析 - 目标检测与跟踪 - python opencv 计算机竞赛

文章目录 0 前言1 课题背景2 实现效果3 DeepSORT车辆跟踪3.1 Deep SORT多目标跟踪算法3.2 算法流程 4 YOLOV5算法4.1 网络架构图4.2 输入端4.3 基准网络4.4 Neck网络4.5 Head输出层 5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; *…

kafka入门(一):kafka消息消费

安装kafka&#xff0c;创建 topic&#xff1a; Windows安装kafka, 详情见&#xff1a;https://blog.csdn.net/sinat_32502451/article/details/133067851 Linux 安装kafka&#xff0c;详情见&#xff1a;https://blog.csdn.net/sinat_32502451/article/details/133080353 添…

python的文件目录操作 1

我们在实际开发中&#xff0c;经常需要对文件进行读取、遍历、修改等操作&#xff0c;通过 python 的标准内置os模块&#xff0c;能够以简洁高效的方式完成这些操作。常见的操作整理如下&#xff1a; 文件夹操作&#xff1a;包括文件夹的创建、修改&#xff08;改名/移动&…

redis cluster搭建

k8s部署 Redis Insight k8s部署redis集群_mob6454cc6c6291的技术博客_51CTO博客 占用的内存竟然这么小&#xff0c;才200M左右 随便选个节点进去&#xff0c;看能否连接上其他节点 redis-cli -h redis-cluster-v1-0.redis-cluster.project-gulimall.svc.cluster.local 再创建个…