题目是一段数字只包含0,1,2 其中2代表0或者1 随机输入这样的一串数字,把其中的2替换成0或者1,要求输出所有可能的结果

import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * @description 算法
 * @date 2021/10/31
 * @Author Mr.Fang
 */
public class Demo {
    /**
     * 题目是一段数字只包含0,1,2
     * 其中2代表0或者1
     * 随机输入这样的一串数字,把其中的2替换成0或者1,要求输出所有可能的结果
     * Example: 输入:121,返回101和111
     * 输入:122,返回100,101,111,110
     * 需要用算法实现输入任意长度的012,返回所有的可能
     */
    public static void main(String[] args) {
        /**
         * 思路:替换源数据所有的2 为1一组数据 或 为0一组数据
         * 得到两组数据,分别对两组数据进行逐个(0变1,1变0)替换
         * 讲得到的两个数组合为一个数组,开始替换数据,从源数据第一个2开始替换
         * 出现的结果数量是: n * 2 (n=2出现的次数)
         *
         */
        // 源数据
        String source = "012210112001201212201212";
        String[] split = source.split("");
        String str = "";
        for (int i = 0; i < split.length; i++) {
            String s = split[i];
            if (s.equals("2")) {
                str += split[i];
            }
        }
        // 所有数字 2 替换为 0
        String first = str.replace("2", "0");
        // 所有数字 2 替换为 1
        String last = str.replace("2", "1");
        List<String> list_f = new ArrayList<>();
        List<String> list_l = new ArrayList<>();
        // 第一组数据
        int length = str.length();
        for (int i = 0; i < length; i++) {
            if (list_f.isEmpty()) {
                list_f.add(first);
            } else {
                String s = list_f.get(i - 1);
                String s1 = s.replaceFirst("0", "1");
                list_f.add(s1);
            }
        }
        // 第二组数据
        for (int i = 0; i < length; i++) {
            if (list_l.isEmpty()) {
                list_l.add(last);
            } else {
                String s = list_l.get(i - 1);
                String s1 = s.replaceFirst("1", "0");
                list_l.add(s1);
            }
        }
        list_f.addAll(list_l); // 何必数组
        // 替换源数据2的位置
        List<String> result = new ArrayList<>();
        for (int i = 0; i < list_f.size(); i++) {
            String[] split1 = list_f.get(i).split("");
            String data = "";
            for (int j = 0; j < split1.length; j++) {
                if (j == 0) {
                    data = source.replaceFirst("2", split1[j]);
                } else {
                    data = data.replaceFirst("2", split1[j]);
                }
            }
            result.add(data);
        }
        System.out.printf("计算输出结果:%d%n", result.size());
        result.forEach(item -> {
            System.out.println(item);
        });

        // 去重
        Set<String> collect = result.stream().collect(Collectors.toSet());
        System.out.printf("最终结果:%d%n", collect.size());
        collect.forEach(item -> {
            System.out.println(item);
        });
    }
}

 

posted @ 2021-10-31 22:03  天葬  阅读(95)  评论(0编辑  收藏  举报