算法 之 找出不同的二进制字符串

72 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第5天,点击查看活动详情

前言

每日一题提前预防老年痴呆,今天又是适合睡觉的日子,刚睡醒就来了一题。

题目

找出不同的二进制字符串 【难度中等】 窍门:random

给你一个字符串数组 nums ,该数组由 n 个 互不相同 的二进制字符串组成,且每个字符串长度都是 n 。请你找出并返回一个长度为 n 且 没有出现 在 nums 中的二进制字符串。如果存在多种答案,只需返回 任意一个 即可。

示例 1: 输入:nums = ["01","10"] 输出:"11" 解释:"11" 没有出现在 nums 中。"00" 也是正确答案。

示例 2: 输入:nums = ["00","01"] 输出:"11" 解释:"11" 没有出现在 nums 中。"10" 也是正确答案。

示例 3: 输入:nums = ["111","011","001"] 输出:"101" 解释:"101" 没有出现在 nums 中。"000"、"010"、"100"、"110" 也是正确答案。

理解题意

通过题目我们可以了解到需要在数组中找到与数组中各值不同的二进制,假设现在数组中有00 01 ,那就是满足的答案有11 10,因为他们不存在于数组,然后改题的解题思路非常广我想到了三种。

本质上都要利用hashset哈希表去进行去重,与匹配是否存在。

  1. 利用随机值去进行判断,很偷鸡的方式,有可能过不去,有可能会很快,猴子排序好吧
  2. 利用对角线算法,详细百度查一下,比较难懂
  3. 利用暴力遍历,由于数据量不大可以吧所有组合都遍历出来,还有一种方式是试用前缀树组合,原理和暴力差不,但是速度还快一些

解题代码

public class 找出不同的二进制字符串 {

    void run(){
        System.out.println(findDifferentBinaryString(new String[]{"11","01"}));
    }

    public String findDifferentBinaryString(String[] nums) {
        int n = nums.length;
        int len = nums[0].length();

        Set<String> set = new HashSet<>();
        for (int i = 0; i < n; i++) {
            set.add(nums[i]);
        }

        Random random = new Random();
        String s = "";
        do {
            StringBuilder bd = new StringBuilder();
            for (int i = 0; i < len; i++) {
                bd.append(random.nextInt(2));
            }
            s = bd.toString();

            if (!s.contains(s)) return s;
        } while (set.contains(s));

        return s;
    }

}