題目是一段數字只包含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); }); } }
哇!又賺了一天人民幣

浙公網安備 33010602011771號