当前位置 博文首页 > Inmaturity_7的博客:算法练习贴--32--找不同(Java)

    Inmaturity_7的博客:算法练习贴--32--找不同(Java)

    作者:[db:作者] 时间:2021-08-01 11:43

    找不同

    一、题目描述

    给定两个字符串 s 和 t,它们只包含小写字母。

    字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。

    请找出在 t 中被添加的字母。
    (题目来源:力扣(LeetCode))

    示例 1:
    输入:s = "abcd", t = "abcde"
    输出:"e"
    解释:'e' 是那个被添加的字母。
    
    示例 2:
    输入:s = "", t = "y"
    输出:"y"
    
    示例 3:
    输入:s = "a", t = "aa"
    输出:"a"
    
    示例 4:
    输入:s = "ae", t = "aea"
    输出:"a"
    
    提示:
        0 <= s.length <= 1000
        t.length == s.length + 1
        s 和 t 只包含小写字母
    

    二、解决方法

    1. 排序比较
    class Solution {
         public static char findTheDifference(String s, String t) {
    		 //将两个字符串转换为char数组,排序完比较即可
    		 //1.排序
    		 char[] sArr=s.toCharArray();
    		 Arrays.sort(sArr);
    		 
    		 char[] tArr=t.toCharArray();
    		 Arrays.sort(tArr);
    		 
    		 //2.比较
             for(int i=0;i<s.length();i++){
                 if(sArr[i]!=tArr[i]){
                     return tArr[i];
                 }
             }
             return tArr[t.length()-1];
    	}
    }
    
    
    1. 两个数组分别计字符数再相减
    class Solution {
        public char findTheDifference(String s, String t) {
            //将统计第一个字符串的每个字符的个数
            int[] cnt = new int[26];
            for (int i = 0; i < s.length(); ++i) {
                char ch = s.charAt(i);
                cnt[ch - 'a']++;
            }
            //用第一个字符串统计的个数来减,最后为负数就是多出来的那个数字
            for (int i = 0; i < t.length(); ++i) {
                char ch = t.charAt(i);
                cnt[ch - 'a']--;
                if (cnt[ch - 'a'] < 0) {
                    return ch;
                }
            }
            return ' ';
        }
    }
    
    
    1. 求和比较
    class Solution {
        public char findTheDifference(String s, String t) {
            int as = 0, at = 0;
            //获得第一个字符数组的字符和
            for (int i = 0; i < s.length(); ++i) {
                as += s.charAt(i);
            }
            //获得第二个字符数组的字符和
            for (int i = 0; i < t.length(); ++i) {
                at += t.charAt(i);
            }
            //相减
            return (char) (at - as);
        }
    }
    
    1. 异或运算
    class Solution {
        public char findTheDifference(String s, String t) {
            int ret = 0;
            //求两个数组的所有字符的异或
            for (int i = 0; i < s.length(); ++i) {
                ret ^= s.charAt(i);
            }
            for (int i = 0; i < t.length(); ++i) {
                ret ^= t.charAt(i);
            }
            return (char) ret;
        }
    }
    

    异或运算优化:

    class Solution {
       public char findTheDifference(String s, String t) {
        int n = s.length();
        char ans = t.charAt(n);
        //由两次循环缩减为一次循环
        for (int i = 0; i < n; i++) {
            ans ^= s.charAt(i);
            ans ^= t.charAt(i);
        }
        
        return ans;
    }
    }
    

    位运算普通应用:

    System.out.println("求一批数字的差集="+(8^9^8^3^9));
    System.out.println("求一批数字的与集="+(8&8&8&8&8));
    System.out.println("求一个数字的负数="+(~-9+1));
    System.out.println("求一个数字的2倍="+(8<<1));
    System.out.println("求一个数字的一半=="+(8>>1));
    
    输出:
    求一批数字的差集=3
    求一批数字的与集=8
    求一个数字的负数=9
    求一个数字的2倍=16
    求一个数字的一半==4
    
    cs