311、找不同

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

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

请找出在 t 中被添加的字母。

  

示例 1

输入:s = "abcd", t = "abcde"

输出:"e"

解释:'e' 是那个被添加的字母。

示例 2

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

输出:"y"

  

提示:

0 <= s.length <= 1000

t.length == s.length + 1

s 和 t 只包含小写字母

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/find-the-difference

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

package cn.fansunion.leecode.string;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

/**

 * 找不同

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

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

请找出在 t 中被添加的字母。

力扣

 * @author wen.lei@brgroup.com

 *

 * 2022-2-16

 */

public class FindTheDifference {

     

    /*示例 1:

    输入:s = "abcd", t = "abcde"

    输出:"e"

    解释:'e' 是那个被添加的字母。

    示例 2:

     

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

    输出:"y"*/

     

    /**

     * t中的某个字符,在t中出现的次数>在s中出现的次数;3次for循环

     * @param s

     * @param t

     * @return

     */

    public char findTheDifferenceMap(String s, String t) {

        Map<Character, Integer> sCharCountMap = charCountMap(s);

        Map<Character, Integer> tCharCountMap = charCountMap(t);

        for (Character charOfT : t.toCharArray()) {

            final Integer tCharCount = tCharCountMap.get(charOfT);

            final Integer sCharCount = sCharCountMap.get(charOfT);

            //s中可能不存在t

            if(sCharCount==null || tCharCount>sCharCount) {

                return charOfT;

            }

        }

        //没找到,不应该出现

        return '0';

    }

     

    /**

     * 遍历数组,每个字符和对应的次数map

     * @param arr

     * @return

     */

    private Map<Character, Integer> charCountMap(String s) {

        Map<Character, Integer> numCountMap = new HashMap<>();

        for (Character num : s.toCharArray()) {

            Integer count=numCountMap.get(num);

            if(count==null) {

                count=1;

            }else{

                count++;

            }

            numCountMap.put(num, count);

        }

        return numCountMap;

    }

     

    /**

     * 题目和示例描述有歧义,比如:是否存在"abcd"添加了1个a的情况"abcda",更特殊的"abcda"->"abcdaa"

     * @param s

     * @param t

     * @return

     */

    public char findTheDifferenceBadQuestion(String s, String t) {

        char[] sCharArray=s.toCharArray();

        List<Character> sCharList = new ArrayList<>();

        for (char c : sCharArray) {

            sCharList.add(c);

        }

        for (Character tChar : t.toCharArray()) {

            if(!sCharList.contains(tChar)) {

                return tChar;

            }

        }

        //没找到,一般不会出现;直接习惯返回数字0,没有语法报错,尴尬

        return '0';

    }

}

执行结果:通过

显示详情

添加备注

执行用时:7 ms, 在所有 Java 提交中击败了15.40%的用户

内存消耗:39.9 MB, 在所有 Java 提交中击败了5.06%的用户

通过测试用例:54 54

package test.leecode.string;

import org.junit.Assert;

import org.junit.Test;

import cn.fansunion.leecode.string.FindTheDifference;

/**

 * @author wen.lei@brgroup.com

 *

 * 2022-2-16

 */

public class FindTheDifferenceTest {

    @Test

    public void test() {

        FindTheDifference dif = new FindTheDifference();

        char dif1=dif.findTheDifferenceBadQuestion("abcd","abcde");

        Assert.assertEquals('e',dif1);

        char dif2=dif.findTheDifferenceBadQuestion("abcd","dcbae");

        Assert.assertEquals('e',dif2);

        char dif3=dif.findTheDifferenceBadQuestion("abcd","abcda");

        //2种特殊情况,找不到

        Assert.assertEquals(0,dif3);

        char dif4=dif.findTheDifferenceBadQuestion("abcda","abcdaa");

        Assert.assertEquals(0,dif4);

        //map形式,更严谨

        char dif21=dif.findTheDifferenceMap("abcd","abcde");

        Assert.assertEquals('e',dif21);

        char dif22=dif.findTheDifferenceMap("abcd","dcbae");

        Assert.assertEquals('e',dif22);

        char dif23=dif.findTheDifferenceMap("abcd","abcda");

        Assert.assertEquals('a',dif23);

        char dif24=dif.findTheDifferenceMap("abcda","abcdaa");

        Assert.assertEquals('a',dif24);

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值