当前位置: 首页 > article >正文

蓝桥与力扣刷题(389 找不同)

题目:给定两个字符串 s 和 t ,它们只包含小写字母。字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。请找出在 t 中被添加的字母。

示例 1:

输入:s = "abcd", t = "abcde"
输出:"e"
解释:'e' 是那个被添加的字母。

示例 2:

输入:s = "", t = "y"
输出:"y"

第一种解题思路+代码:

源代码:

class Solution {

    public char findTheDifference(String s, String t) {

        //第一种解题思路:因为t中包含了s,用t删减s的部分即可得到t中被添加的字母

        StringBuffer t1 = new StringBuffer(t);

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

            t1.deleteCharAt(t1.indexOf(s.charAt(i)+"")); //使用deleteCharAt来暴力破解

        }

        return t1.toString().charAt(0);

    }

}

第二种解题思路+代码:

源代码:

class Solution {

    public char findTheDifference(String s, String t) {

        //第二种解题思路:计数  找出两个计数不同的就是被添加的字母

        int[] counter = new int[26];

        //对s进行遍历

        for(char c : s.toCharArray()){

            counter [c - 'a']++;

        }

        //对t进行遍历,使用--counter之后t中会有某个字母的计数小于0,则该字母为被添加的字母

        for(char c : t.toCharArray()){

            if(--counter[c - 'a'] < 0){

                return c ;

            }

        }

        return 0;

    }

}

第三种解题思路+代码:

代码:

class Solution {

    public char findTheDifference(String s, String t) {

        //第三种解题思路:异或运算 找出出现奇数次的字母,该字母为被添加的字母

        /*补充的知识点:

        异或(XOR)是一个二进制运算,具有以下几个重要性质:

        a ^ a = 0:同一个数异或两次,结果是 0。

        a ^ 0 = a:任何数与 0 异或,结果是其本身。

        异或运算满足交换律和结合律:顺序可以任意调整。

        */

        char res = 0;

        //将字符串 s 中的每个字符逐个与 res 进行异或运算。由于异或的性质,重复出现的字符会抵消(即两次异或后变为 0),只留 下        没有在 s 中出现过的字符的异或结果

        for(char c : s.toCharArray()){

            res ^= c;

        }

        //将字符串 t 中的每个字符逐个与 res 进行异或运算。此时,t 中的字符会和 s 中的字符进行抵消,最终会剩下 t 中多出来的      字        符(因为 t 中多出的字符在 s 中没有对应的字符来抵消它)。

        for(char c : t.toCharArray()){

            res ^= c;

        }

        return res; //最终返回的 res 中存储的就是 t 中比 s 多出的那个字符。

    }

}

第四种解题思路+代码:

代码:

class Solution {

    public char findTheDifference(String s, String t) {

       //第四种解题思路:使用java的stream操作

       //使用 Java 8 中的 Stream API 和 reduce 操作 来实现异或运算,从而找到字符串 t 中比字符串 s 多出的那个字符。

       //字符串拼接:s + t 会将字符串 s 和字符串 t 连接在一起。

       //.chars() 方法会将字符串转换成一个 IntStream,每个字符会被转换为其对应的 ASCII 码值。

       //reduce 是 Stream API 的一个聚合操作,用来将流中的所有元素按指定的方式进行合并。在这里,reduce 的初始值是 0,然后将流中的每个字符的 ASCII 值进行 异或 运算。(a, b) -> a ^ b 是一个 Lambda 表达式,用来定义两个元素 a 和 b 之间的操作:将 a 和 b 异或。

       //reduce 返回的结果是一个 int,表示最终的异或结果。由于字符在计算机中是以 ASCII 码存储的,所以要将该结果转换为字符(char)类型,得到最终多出的字符。

       return(char)(s + t).chars().reduce(0,(a,b) -> a ^ b);

    }

}

总结:个人认为前两种的解题思路比较简单易懂,后面两种的解题思路对于java的理解要有一定的掌握和深入。因此,前两种方法的时间和空间复杂度也会相对复杂,后两种方法运行起来会相对简单高效。


http://www.kler.cn/a/500146.html

相关文章:

  • 在 Flownex 网络中创建传热元件
  • Linux (CentOS) 安装 Docker 和 Docker Compose
  • 代码随想录算法训练营第三十二天|509.斐波那契数、70.爬楼梯、746.使用最小花费爬楼梯
  • 设计一篇利用python爬虫获取1688详情API接口的长篇软文
  • 芯片:为何英伟达的GPU能在AI基础设施领域扮演重要角色?
  • 【网络协议】交换机概念与配置(第一部分)
  • _STM32关于CPU超频的参考_HAL
  • RabbitMQ介绍及安装(基于docker)
  • 服务器多节点 Grafana、Prometheus 和 Node-Exporter Docker版本部署指南
  • Bash语言的正则表达式
  • 9.java中String,StringBuilder,StringBuffer 什么区别
  • MySQL教程之:与服务器的连接和断开连接
  • 图像处理 | 图像二值化
  • 财务自动化用Python还是RPA?各有什么优缺点
  • el-tab-pane 的label怎么显示很多数据
  • 【Leetcode-找到所有数组中消失的数字】利用标记出现数组中出现过的数字解决数组中消失的数字问题
  • 【开源免费】基于SpringBoot+Vue.JS共享汽车管理系统(JAVA毕业设计)
  • Cannot find -lgL
  • 【IEEE出版,连续4年EI收录,检索稳定 |南京航空航天大学主办,航空航天交叉研究院承办】第五届传感器与信息技术国际学术会议(ICSI 2025)
  • 如何从 Keycloak 的 keycloak-themes.jar 中提取原生主题并自定义设置
  • Chapter 4.6:Coding the GPT model
  • 【python进阶——用类实现数据组织】
  • LeetCode 热题 100 | 双指针