当前位置:   article > 正文

张新、黎民、王亮三位老师分别来自湖南、广西、甘肃,分别教语文、数学和英语。已知:(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代码清单:

  1. package Qestion;
  2. import java.util.ArrayList;
  3. public class Qestion {
  4. private String situation[][][] = new String[3][3][3];
  5. private static ArrayList<String[]> set = new ArrayList<>();
  6. private static ArrayList<String[]> list = new ArrayList<>();
  7. private static ArrayList<String[]> list2 = new ArrayList<>();
  8. private static int count = 0; //计数变量
  9. public Qestion() {
  10. // TODO Auto-generated constructor stub
  11. String name[] = { "ZhangXin", "LiMin", "WangLiang" };
  12. String province[] = { "HuNan", "GuangXi", "GanSu" };
  13. String subject[] = { "Chinese", "Math", "English" };
  14. for (int i = 0; i < 3; i++) {
  15. for (int j = 0; j < 3; j++) {
  16. for (int k = 0; k < 3; k++) {
  17. this.situation[i][j][k] = name[i] + "," + province[j] + ","
  18. + subject[k];
  19. list.add(new String[] { name[i], province[j], subject[k] }); // list中放字符串数组
  20. }
  21. }
  22. }
  23. }
  24. public static void main(String[] args) {
  25. // TODO Auto-generated method stub
  26. Qestion qes = new Qestion();
  27. qes.list_avail(list);
  28. // Iterator<String[]> it =set.iterator(); //查看set中内容
  29. // while(it.hasNext()){ //输出符合条件的所有情况
  30. qes.func1();
  31. qes.func2();
  32. // System.out.println(list2.size());
  33. }
  34. public static String String_LinkTool(String[] str) {
  35. int N = str.length;
  36. String s = "";
  37. for (int i = 0; i < N; i++) {
  38. s = s + str[i];
  39. }
  40. return s;
  41. }
  42. public static Boolean String_IsexistTool(String... s) {
  43. String FatherStr = s[0];
  44. String SonStr0 = s[1];
  45. String SonStr1 = s[2];
  46. String SonStr2 = s[3];
  47. String SonStr3 = s[4];
  48. String SonStr4 = s[5];
  49. String SonStr5 = s[6];
  50. String SonStr6 = s[7];
  51. String SonStr7 = s[8];
  52. String SonStr8 = s[9];
  53. int result0 = -1, result1 = -1, result2 = -1, result3 = -1, result4 = -1, result5 = -1, result6 = -1, result7 = -1, result8 = -1;
  54. result0 = FatherStr.indexOf(SonStr0);
  55. result1 = FatherStr.indexOf(SonStr1);
  56. result2 = FatherStr.indexOf(SonStr2);
  57. result3 = FatherStr.indexOf(SonStr3);
  58. result4 = FatherStr.indexOf(SonStr4);
  59. result5 = FatherStr.indexOf(SonStr5);
  60. result6 = FatherStr.indexOf(SonStr6);
  61. result7 = FatherStr.indexOf(SonStr7);
  62. result8 = FatherStr.indexOf(SonStr8);
  63. if ((result0 >= 0) && (result1 >= 0) && (result2 >= 0)
  64. && (result3 >= 0) && (result4 >= 0) && (result5 >= 0)
  65. && (result6 >= 0) && (result7 >= 0) && (result8 >= 0)) {
  66. // System.out.println(FatherStr);
  67. // count++;
  68. return true;
  69. } else {
  70. return false;
  71. }
  72. }
  73. public static Boolean Judge_assist(String[] str, String a, String b) {
  74. int result00 = -1, result01 = -1;
  75. for (int i = 0; i < str.length; i++) {
  76. result00 = str[i].indexOf(a);
  77. result01 = str[i].indexOf(b);
  78. if ((result00 >= 0) && (result01 >= 0)) {
  79. return false;
  80. }
  81. }
  82. return true;
  83. }
  84. public void list_avail(ArrayList<String[]> list) {
  85. int N = list.size();
  86. for (int i = 0; i < N; i++) { // 得到2925种种组合,放入set中
  87. for (int j = i + 1; j < N; j++) { // 1 2 3 4 5 6 ... 27
  88. for (int k = j + 1; k < N; k++) {
  89. String[] ss = new String[9];
  90. ss[0] = list.get(i)[0];
  91. ss[1] = list.get(i)[1];
  92. ss[2] = list.get(i)[2];
  93. ss[3] = list.get(j)[0];
  94. ss[4] = list.get(j)[1];
  95. ss[5] = list.get(j)[2];
  96. ss[6] = list.get(k)[0];
  97. ss[7] = list.get(k)[1];
  98. ss[8] = list.get(k)[2];
  99. set.add(ss);
  100. }
  101. }
  102. }
  103. }
  104. public void func1() {
  105. for (String[] s : set) { // 符合分别由9个选项组成的,无重复组合(共36个)
  106. if (String_IsexistTool(String_LinkTool(s), "ZhangXin", "LiMin",
  107. "WangLiang", "HuNan", "GuangXi", "GanSu", "Chinese",
  108. "Math", "English")) {
  109. // System.out.println(String_LinkTool(it.next()));
  110. String[] ss = s;
  111. // System.out.println(ss[3]);
  112. String[] temp = new String[3];
  113. temp[0] = ss[0] + ss[1] + ss[2];
  114. temp[1] = ss[3] + ss[4] + ss[5];
  115. temp[2] = ss[6] + ss[7] + ss[8];
  116. list2.add(temp);
  117. count++;
  118. }
  119. }
  120. }
  121. public void func2() {
  122. for (String[] s : list2) { // 判断符合四个条件的组合
  123. if (Judge_assist(s, "ZhangXin", "HuNan")
  124. && Judge_assist(s, "LiMin", "GuangXi")
  125. && Judge_assist(s, "English", "HuNan")
  126. && (!Judge_assist(s, "Chinese", "GuangXi"))
  127. && Judge_assist(s, "Math", "LiMin")) {
  128. System.out.println(s[0] + " " + s[1] + " " + s[2]);
  129. }
  130. }
  131. }
  132. }

程序说明文档:

Qestion( )  //构造方法,完成27种小组合的构建,并存入list数组列表中。

list_avail(ArrayList<String> )   //够建2925种大组合,并存入set数组列表中。

String_IsexistTool(String…)   //剔除工具,处理后得到36种合理组合,并存入list2中。

Judge_assist(String[],String,String)   //条件判断辅助工具,由题中判断条件返回布尔值。

String_LinkTool(String[])   //字符串连接工具,将字符串数组中内容连接后返回。

int count  //记录个数

 

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/290187
推荐阅读
相关标签
  

闽ICP备14008679号