算法练习贴--32--找不同(Java)

找不同

一、题目描述

给定两个字符串 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

猜你喜欢

转载自blog.csdn.net/Inmaturity_7/article/details/111387333