这是悦乐书的第214次更新,第227篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第82题(顺位题号是389)。给定两个字符串s和t,它们只包含小写字母。字符串t由随机混洗字符串s生成,然后在随机位置再添加一个字母。找到t中添加的字母。例如:

输入:s =“abcd”, t =“abcde”

输出:'e'

说明:'e'是添加的字母。

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

因为限定字符串都是小写字母,可以借助一个26长度的数组,将t中的字符出现次数记录下来,然后再去遍历s的字符,只要有对应的就做减法,最后再去找数组中为1的元素的索引,将其和字符a相加,就是t中添加的字母。

此解法的时间复杂度是O(n),空间复杂度是O(1)。

  1. public char findTheDifference(String s, String t) {
  2. int[] arr = new int[26];
  3. for (int i=0; i<t.length(); i++) {
  4. arr[t.charAt(i)-'a']++;
  5. }
  6. for (int j=0; j<s.length(); j++) {
  7. arr[s.charAt(j)-'a']--;
  8. }
  9. for (int k=0; k<arr.length; k++) {
  10. if (arr[k] == 1) {
  11. return (char)(k+'a');
  12. }
  13. }
  14. return '0';
  15. }

03 第二种解法

还是使用长度26的数组,将s中出现的字符及次数记录下来,再去遍历t的字符,同时对其对应数组中的元素做自减,如果自减后小于0,即表示当前字符没有在s中出现过,此字符就是t中添加的字母。

此解法的时间复杂度是O(n),空间复杂度是O(1)。

  1. public char findTheDifference2(String s, String t) {
  2. int[] arr = new int[26];
  3. for (int i=0; i<s.length(); i++) {
  4. arr[s.charAt(i)-'a']++;
  5. }
  6. for (int j=0; j<t.length(); j++) {
  7. if (--arr[t.charAt(j)-'a'] < 0) {
  8. return t.charAt(j);
  9. }
  10. }
  11. return '0';
  12. }

04 第三种解法

使用异或位运算,其规则是两边的对应位不同时,取1,否则取0。两个相同的数做异或运算时,运算结果是0。0和一个非0的数做异或运算时,运算结果是那个非0的数。将s和t中的所有字符做异或运算,最后的运算结果就是多出来的那个字符。

此解法的时间复杂度是O(n),空间复杂度是O(1)。

  1. public char findTheDifference3(String s, String t) {
  2. int ch = 0;
  3. for (int i=0; i<s.length(); i++) {
  4. ch = ch^s.charAt(i);
  5. }
  6. for (int j=0; j<t.length(); j++) {
  7. ch = ch^t.charAt(j);
  8. }
  9. return (char)ch;
  10. }

05 第四种解法

此解法思路和第三种解法一样,只是将两次循环合并到一次循环中去了。

此解法的时间复杂度是O(n),空间复杂度是O(1)。

  1. public char findTheDifference4(String s, String t) {
  2. int ch = t.charAt(t.length()-1);
  3. for (int i=0; i<s.length(); i++) {
  4. ch = ch^t.charAt(i)^s.charAt(i);
  5. }
  6. return (char)ch;
  7. }

06 第五种解法

既然可以做异或运算,那么也可以尝试做加减运算,用t中所有字符的和减去s中所有字符的和,剩下的差就是t中多出的字母。

此解法的时间复杂度是O(n),空间复杂度是O(1)。

  1. public char findTheDifference5(String s, String t) {
  2. char ch = t.charAt(t.length()-1);
  3. for (int i=0; i<s.length(); i++) {
  4. ch -= s.charAt(i);
  5. ch += t.charAt(i);
  6. }
  7. return ch;
  8. }

07 小结

算法专题目前已连续日更超过两个月,算法题文章82+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

LeetCode算法题-Find the Difference(Java实现-五种解法)的更多相关文章

  1. LeetCode算法题-Number Complement(Java实现-五种解法)

    这是悦乐书的第240次更新,第253篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第107题(顺位题号是476).给定正整数,输出其补码数.补充策略是翻转其二进制表示的位 ...

  2. LeetCode算法题-Move Zeroes(Java实现-三种解法)

    这是悦乐书的第201次更新,第211篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第67题(顺位题号是283).给定一个数组nums,写一个函数将所有0移动到它的末尾,同 ...

  3. LeetCode算法题-Missing Number(Java实现-四种解法)

    这是悦乐书的第200次更新,第209篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第65题(顺位题号是268).给定一个包含n个不同数字的数组,取自0,1,2,...,n ...

  4. LeetCode算法题-Ugly Number(Java实现-四种解法)

    这是悦乐书的第199次更新,第208篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第64题(顺位题号是263).编写一个程序来检查给定的数字是否是一个丑陋的数字.丑陋的数 ...

  5. LeetCode算法题-Add Digits(Java实现-3种解法)

    这是悦乐书的第199次更新,第207篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第63题(顺位题号是258).给定非负整数num,重复添加其所有数字,直到结果只有一位数 ...

  6. LeetCode算法题-Minimum Absolute Difference in BST(Java实现)

    这是悦乐书的第253次更新,第266篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第120题(顺位题号是530).给定具有非负值的二叉搜索树,找到任意两个节点的值之间的最 ...

  7. LeetCode算法题-Rotate String(Java实现)

    这是悦乐书的第317次更新,第338篇原创 在开始今天的算法题前,说几句,今天是世界读书日,推荐两本书给大家,<终身成长>和<禅与摩托车维修艺术>,值得好好阅读和反复阅读. 0 ...

  8. LeetCode算法题-Rotated Digits(Java实现)

    这是悦乐书的第316次更新,第337篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第185题(顺位题号是788).如果一个数字经过180度旋转后,变成了一个与原数字不同的 ...

  9. LeetCode算法题-Toeplitz Matrix(Java实现)

    这是悦乐书的第312次更新,第333篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第181题(顺位题号是766).如果从左上角到右下角的每个对角线具有相同的元素,则矩阵是 ...

随机推荐

  1. MySQL中间件之ProxySQL(11):链式规则( flagIN 和 flagOUT )

    返回ProxySQL系列文章:http://www.cnblogs.com/f-ck-need-u/p/7586194.html 1.理解链式规则 在mysql_query_rules表中,有两个特殊 ...

  2. [转]使用jenkins实现持续集成

    本文转自:https://www.cnblogs.com/zishengY/p/7170656.html 一.jenkins 介绍 它是一个自动化的周期性的集成测试过程,从检出代码.编译构建.运行测试 ...

  3. EF C# ToPagedList方法 The method 'Skip' is only supported for sorted input in LINQ to Entities. The method 'OrderBy' must ……

    报错信息:The method 'Skip' is only supported for sorted input in LINQ to Entities. The method 'OrderBy' ...

  4. 使用PoolingHttpClientConnectionManager解决友盟(umeng)推送在多线程环境推送失败的问题

    在友盟(umeng)提供的服务端推送的sdk中,使用的是apache提供的httpclient.在单线程化境下,httpclient工作没有问题.但是由于umeng的sdk中并未考虑并发的情况,因此很 ...

  5. [linux] tcpdump抓包案例

    1.常见参数 tcpdump -i eth0 -nn -s0 -v port 80 -i 选择监控的网卡 -nn 不解析主机名和端口号,捕获大量数据,名称解析会降低解析速度 -s0 捕获长度无限制 - ...

  6. [android] 表格布局和绝对布局

    /*****************2016年4月28日 更新*************************************/ 知乎:为什么Android没有像iOS一样提供autolay ...

  7. myeclipse无法部署项目的解决

    一.问题 myeclipse无法部署项目,点击这个部署按钮没有反应. 二.解决办法 1.找到myeclipse的工作空间,也就是启动时的那个项目保存的空间,我的是在D:\myeclipse_works ...

  8. Reinforcement Learning: An Introduction读书笔记(3)--finite MDPs

     > 目  录 <  Agent–Environment Interface Goals and Rewards Returns and Episodes Policies and Val ...

  9. ASPxGridView 添加勾选列--全选 和 后端获取勾的行ID

    一.HTML 代码 <table style="width: 100%;"> <tr> <td> <asp:Button ID=" ...

  10. node起步

    首先,在项目目录下创建一个叫 app.js 的文件,并写如以下代码: app.js const http = require('http'); const hostname = '127.0.0.1' ...