张新、黎民、王亮三位老师分别来自湖南、广西、甘肃,分别教语文、数学和英语。已知:(1)张新不是湖南人,黎明不是广西人;(2)湖南的老师不教英语;(3)广西的老师教语文;(4)黎民不教数学。由此可知,王
【已解決】 TCL面試題(邏輯推理+編程驗證)
原 題:
張新、黎民、王亮三位老師分別來自湖南、廣西、甘肅,分別教語文、數學和英語。已知:(1)張新不是湖南人,黎明不是廣西人;(2)湖南的老師不教英語;(3)廣西的老師教語文;(4)黎民不教數學。由此可知,王亮教的是:(A)
A.數學 ??????????B.英語??????????C.語文 ???????????D.無法確定
邏輯推理:
步驟1:
(1)? 由條件3知,廣西老師教語文;
(2)? 結合條件2得:湖南老師可能教數學or語文,而上步(1)中知語文已確定由廣西老師教,則湖南老師只能教數學;
(3)? 則得到如下對應關系:廣西-語文 ?湖南-數學? 甘肅-英語
步驟2:
(1)? 由條件4得,黎明可能教語文or英語,則步驟1中對應結論表明:他只能是廣西or甘肅人。又由條件1得,他可能是湖南or甘肅人,我們通過對這兩個約束條件取交集,可以確定他必是甘肅人,即黎民-甘肅-英語;
(2)? 由條件1得,張新可能是廣西or甘肅人,又因上步(1)中黎民已確定為甘肅人,則張新必為廣西人;
(3)? 則不難得出如下對應關系:張新-廣西-語文 ?王亮-湖南-數學? 黎民-甘肅-英語
推理過程見附圖1:
編程驗證:
編程思想:
(1)? 將名字、省份、學科,共9個元素放入3個長度為3的字符串數組中,分別為name[3],province[3],subject[3]。 然后讓它們全部自由組合,得到27種不同小組合。
? ? ? ? ? ? 特別說明:這27種僅僅是由3個元素構成的小組合,我們要得到的最終大組合是由3對這樣的子組合構成的由9個無重復元素構成的大組合。
(2)? 接下來,我們要解決大組合的構造問題,即利用這27種小組合構建大組合的問題。本文利用了一種有效的組合方法,操作過程見圖2。
?
(3)? 經上步可得2925種大組合,遺憾的其中部分大組合并不是由9個不同元素分別構成的,存在一個元素多次出現的情況,不符合題目要求,需剔除。特別提示:文字描述比較抽象,讀者可以在代碼中自行輸出查看。
(4)? 如上所述,剔除不合理組合不難,通過判斷每條大組合中是否包含全部的9個元素即可。未全部包含則剔除,處理后得到符合要求的36種大組合。
(5)? 然后,我們將題中的四個約束條件用’&&’形式連接,用來對36種組合進行判斷,從而得到最終的符合要求組合。
程序驗證,運行結果見圖3:
完整程序Java代碼清單:
package Qestion;import java.util.ArrayList;public class Qestion {private String situation[][][] = new String[3][3][3];private static ArrayList<String[]> set = new ArrayList<>();private static ArrayList<String[]> list = new ArrayList<>();private static ArrayList<String[]> list2 = new ArrayList<>();private static int count = 0; //計數變量public Qestion() {// TODO Auto-generated constructor stubString name[] = { "ZhangXin", "LiMin", "WangLiang" };String province[] = { "HuNan", "GuangXi", "GanSu" };String subject[] = { "Chinese", "Math", "English" };for (int i = 0; i < 3; i++) {for (int j = 0; j < 3; j++) {for (int k = 0; k < 3; k++) {this.situation[i][j][k] = name[i] + "," + province[j] + ","+ subject[k];list.add(new String[] { name[i], province[j], subject[k] }); // list中放字符串數組}}}}public static void main(String[] args) {// TODO Auto-generated method stubQestion qes = new Qestion();qes.list_avail(list);// Iterator<String[]> it =set.iterator(); //查看set中內容// while(it.hasNext()){ //輸出符合條件的所有情況qes.func1();qes.func2(); // System.out.println(list2.size());}public static String String_LinkTool(String[] str) {int N = str.length;String s = "";for (int i = 0; i < N; i++) {s = s + str[i];}return s;}public static Boolean String_IsexistTool(String... s) {String FatherStr = s[0];String SonStr0 = s[1];String SonStr1 = s[2];String SonStr2 = s[3];String SonStr3 = s[4];String SonStr4 = s[5];String SonStr5 = s[6];String SonStr6 = s[7];String SonStr7 = s[8];String SonStr8 = s[9];int result0 = -1, result1 = -1, result2 = -1, result3 = -1, result4 = -1, result5 = -1, result6 = -1, result7 = -1, result8 = -1;result0 = FatherStr.indexOf(SonStr0);result1 = FatherStr.indexOf(SonStr1);result2 = FatherStr.indexOf(SonStr2);result3 = FatherStr.indexOf(SonStr3);result4 = FatherStr.indexOf(SonStr4);result5 = FatherStr.indexOf(SonStr5);result6 = FatherStr.indexOf(SonStr6);result7 = FatherStr.indexOf(SonStr7);result8 = FatherStr.indexOf(SonStr8);if ((result0 >= 0) && (result1 >= 0) && (result2 >= 0)&& (result3 >= 0) && (result4 >= 0) && (result5 >= 0)&& (result6 >= 0) && (result7 >= 0) && (result8 >= 0)) {// System.out.println(FatherStr);// count++;return true;} else {return false;}}public static Boolean Judge_assist(String[] str, String a, String b) {int result00 = -1, result01 = -1;for (int i = 0; i < str.length; i++) {result00 = str[i].indexOf(a);result01 = str[i].indexOf(b);if ((result00 >= 0) && (result01 >= 0)) {return false;}}return true;}public void list_avail(ArrayList<String[]> list) {int N = list.size();for (int i = 0; i < N; i++) { // 得到2925種種組合,放入set中for (int j = i + 1; j < N; j++) { // 1 2 3 4 5 6 ... 27for (int k = j + 1; k < N; k++) {String[] ss = new String[9];ss[0] = list.get(i)[0];ss[1] = list.get(i)[1];ss[2] = list.get(i)[2];ss[3] = list.get(j)[0];ss[4] = list.get(j)[1];ss[5] = list.get(j)[2];ss[6] = list.get(k)[0];ss[7] = list.get(k)[1];ss[8] = list.get(k)[2];set.add(ss);}}}}public void func1() {for (String[] s : set) { // 符合分別由9個選項組成的,無重復組合(共36個)if (String_IsexistTool(String_LinkTool(s), "ZhangXin", "LiMin","WangLiang", "HuNan", "GuangXi", "GanSu", "Chinese","Math", "English")) {// System.out.println(String_LinkTool(it.next()));String[] ss = s;// System.out.println(ss[3]);String[] temp = new String[3];temp[0] = ss[0] + ss[1] + ss[2];temp[1] = ss[3] + ss[4] + ss[5];temp[2] = ss[6] + ss[7] + ss[8];list2.add(temp);count++;}}}public void func2() {for (String[] s : list2) { // 判斷符合四個條件的組合if (Judge_assist(s, "ZhangXin", "HuNan")&& Judge_assist(s, "LiMin", "GuangXi")&& Judge_assist(s, "English", "HuNan")&& (!Judge_assist(s, "Chinese", "GuangXi"))&& Judge_assist(s, "Math", "LiMin")) {System.out.println(s[0] + " " + s[1] + " " + s[2]);}}} }程序說明文檔:
Qestion( )??//構造方法,完成27種小組合的構建,并存入list數組列表中。
list_avail(ArrayList<String> )?? //夠建2925種大組合,并存入set數組列表中。
String_IsexistTool(String…)?? //剔除工具,處理后得到36種合理組合,并存入list2中。
Judge_assist(String[],String,String)? ?//條件判斷輔助工具,由題中判斷條件返回布爾值。
String_LinkTool(String[])?? //字符串連接工具,將字符串數組中內容連接后返回。
int count??//記錄個數
?
?
?
?
?
總結
以上是生活随笔為你收集整理的张新、黎民、王亮三位老师分别来自湖南、广西、甘肃,分别教语文、数学和英语。已知:(1)张新不是湖南人,黎明不是广西人;(2)湖南的老师不教英语;(3)广西的老师教语文;(4)黎民不教数学。由此可知,王的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HTTP 中POST GET 区别
- 下一篇: 【已解决】tomcat报严重: Sock