题目是一段数字只包含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); }); } }
哇!又赚了一天人民币