前言

一前公司同事把此题放在群里,求大家帮忙解答。

因为没有其他条件和说明。我的第一印象就是:方格里应该填1~9整数中剩下的1~8,且不能重复。于是拿着笔进行了一通计算。。。后来发现无解。

接着,就想里面的算术运算符(+、-、×、÷),不按优先级,直接按先后顺序来计算,如:a - b × c,当做(a - b) × c 来运算。最后得到如下结果:

5   8   9
7   6   4
3   2   1

为了锻炼下自己的算法能力,后来用Java写了份代码来测试:

public static void main(String[] args) {nineBlockBox();
}private static void nineBlockBox() {List<int[]> result = compute();printf("打印结果:\n");for (int i = 0; i < result.size(); i++) {printf("第%d组结果:\n", i+1);int count = 0;for (int a : result.get(i)) {printf(a + "\t");if (++count == 3) {printf("\n");count = 0;}}}
}private static List<int[]> compute() {//  九宫格位置://  0   1   2//  3   4   5//  6   7   8// 条件// ① (nb[0] + nb[1]) -  9    = 4// ② (nb[3] - nb[4]) * nb[5] = 4// ③ (nb[6] + nb[7]) - nb[8] = 4// ④ (nb[0] + nb[3]) / nb[6] = 4// ⑤ (nb[1] - nb[4]) * nb[7] = 4// ⑥ ( 9    - nb[5]) - nb[8] = 4List<int[]> list = new ArrayList<>();int[] nb = new int[9];for (int i = 1; i <= 9; i++) {// 初始化数值initArr(nb);if (!isNumValid(nb, i)) {continue;}nb[0] = i;// ① (nb[0] + nb[1]) -  9    = 4int temp = 4 + 9 - nb[0];if (!isNumValid(nb, temp)) {nb[0] = 0;continue;}nb[1] = temp;for (int j = 1; j <= 9; j++) {if (!isNumValid(nb, j)) {continue;}nb[5] = j;// ⑥ ( 9    - nb[5]) - nb[8] = 4temp = 9 - nb[5] - 4;if (!isNumValid(nb, temp)) {nb[5] = 0;continue;}nb[8] = temp;for (int k = 1; k <= 9; k++) {if (!isNumValid(nb, k)) {continue;}nb[3] = k;// ② (nb[3] - nb[4]) * nb[5] = 4// 4 = 1 * 4 = 2 * 2temp = nb[3] - 4 / nb[5];if (!isNumValid(nb, temp)) {nb[3] = 0;continue;}nb[4] = temp;for (int m = 1; m <= 9; m++) {if (!isNumValid(nb, m)) {continue;}nb[6] = m;// ③ (nb[6] + nb[7]) - nb[8] = 4temp = 4 + nb[8] - nb[6];if (!isNumValid(nb, temp)) {nb[6] = 0;continue;}nb[7] = temp;// ④ (nb[0] + nb[3]) / nb[6] = 4// ⑤ (nb[1] - nb[4]) * nb[7] = 4if (((nb[0] + nb[3]) / nb[6] == 4) && ((nb[1] - nb[4]) * nb[7] == 4)) {int[] result = new int[nb.length];System.arraycopy(nb, 0, result, 0, nb.length);list.add(result);}nb[6] = nb[7] = 0;}nb[3] = nb[4] = 0;}nb[5] = nb[8] = 0;}}return list;
}private static void initArr(int[] arr) {Arrays.fill(arr, 0);arr[2] = 9;
}private static boolean isNumValid(final int[] arr, final int num) {if (num < 1 || num > 9) {return false;}for (int a : arr) {if (a == num) {return false;}}return true;
}

打印结果:

后来百度得知这是一道腾讯校招笔试题。

正题

题目:

用0~100的整数填入以下方格中,使填入后的运算结果,满足下图所示的条件。求出所有解。

个人解答过程:

把每一个条件进行,并把相关的条件进行整合分析,最后根据整合结果写代码。条件的分析在代码中(为了方便阅读理解,没有作优化,如i, j, k临时变量完全可以去掉)

private static List<int[]> compute_100() {//  九宫格位置://  0   1   2//  3   4   5//  6   7   8// 条件// ① a[0] + a[1] -  9   = 4// ② a[3] - a[4] * a[5] = 4// ③ a[6] + a[7] - a[8] = 4// ④ a[0] + a[3] / a[6] = 4// ⑤ a[1] - a[4] * a[7] = 4// ⑥  9   - a[5] - a[8] = 4/*分析①:a[0] + a[1] = 13      -->     a[0]∈[0,13], a[1]∈[0,13]    ......⑦②:a[3] >= 4④:a[0] <= 4, a[6] != 0  +⑦-->   a[0]∈[0,4],a[1]∈[9,13]       ......⑧⑤:a[1] >= 4             +⑧-->   (a[4] * a[7])∈[5,9],即:a[4]∈[1,9],a[7]∈[1,9]⑥:a[5] + a[8] = 5       -->     a[5]∈[0,5], a[8]∈[0,5]*/List<int[]> list = new ArrayList<>();int[] a = new int[9];a[2] = 9;for (int i = 0; i <= 4; i++) {a[0] = i;a[1] = 13 - i; // ① a[0] + a[1] -  9   = 4for (int j = 0; j <= 5; j++) {a[5] = j;a[8] = 5 - j; // ⑥ 9   - a[5] - a[8] = 4for (int k = 1; k <= 9; k++) {a[4] = k;a[3] = 4 + a[4] * a[5]; // ② nb[3] - nb[4] * nb[5] = 4float temp = (a[1] - 4) / a[4]; // ⑤ nb[1] - nb[4] * nb[7] = 4// 去小数if (a[1] - a[4] * temp != 4f) {continue;}a[7] = (int)temp;a[6] = 4 + a[8] - a[7]; // ③ nb[6] + nb[7] - nb[8] = 4if (a[6] != 0) {// 去小数if (a[0] + a[3] * 1f / a[6] == 4f) { // ④ nb[0] + nb[3] / nb[6] = 4int[] result = new int[a.length];System.arraycopy(a, 0, result, 0, a.length);list.add(result);}}}}}return list;
}

打印结果只有一组:

一道九宫格算法面试题相关推荐

  1. 一道百度算法面试题讲解

    题目: 假设有一个大水池,其容积为poolSize,还有n个彼此大小不同的水桶,分别是B1,B2,B3,B4,B5..Bn,放在一个数组中 .请给出水桶的所有组合,使得他们的容积之和刚好可以灌满整个水 ...

  2. 一道JS算法面试题——冒泡、选择排序

    JS排序算法 基础排序 冒泡排序 选择排序 面试题 基础排序 今天学习了数据结构,遇到了一个关于算法的面试题,然后从中想到了冒泡排序和选择排序对一个数组从小到大的排序的方法,今天分享给大家,顺便记录下 ...

  3. 记一道超级简单的 Java 算法面试题,但无人通过

    点击上方蓝字设为星标 下面开始今天的学习- 作者:方志宏(已获作者授权转载,禁止二次转载) 来源:https://zhuanlan.zhihu.com/p/57859872 这可能是历史上最简单的一道 ...

  4. 记一道超级简单的算法面试题,90%的人没能完整答出来

    作者:方志宏(已获作者授权转载,禁止二次转载) 来源:https://zhuanlan.zhihu.com/p/57859872 这可能是历史上最简单的一道 Java 算法面试题了. 题目很简单,完成 ...

  5. 一道亚马逊算法面试题的情景分析

    阅读博客的朋友可以观看视频: http://study.163.com/course/courseMain.htm?courseId=1002942008 我们聚焦于一道亚马逊的算法面试题,通过分析该 ...

  6. 分享一道算法面试题和它的三种解法

    最近遇到了一道很有趣的算法面试题,乍一看逻辑很简单,O(N^2)时间复杂度的解决方式可以在常规语义下得到解决.但是O(N^2)时间复杂度之下缓慢的运行效率和重复的计算总让人觉得还有可以优化的空间.接下 ...

  7. twitter java_Twitter算法面试题详解(Java实现)

    最近在网上看到一道Twitter的算法面试题,网上已经有人给出了答案,不过可能有些人没太看明白(我也未验证是否正确),现在给出一个比较好理解的答案.先看一下题目. 图1 先看看图图1.可以将方块看做砖 ...

  8. 微软的100道算法面试题(终结版)

    前言 数据结构与算法的重要性已不言而喻,最近,我整理出十大经典排序算法.五大常用算法总结,今天特意整理出微软面试的100题,若有不足之处,欢迎指正!由于篇幅过长,前30道题目写在上一篇,大家可以进我的 ...

  9. Java算法面试题(007) 蒙提霍尔问题(三门问题)

    简介 此问题本身和算法无关,本质上一个关于概率的问题,在一些高等级的面试也经常被问及,因此收录在Java算法面试题系列中. 三门问题(Monty Hall problem)亦称为蒙提霍尔问题.蒙特霍问 ...

  10. 数据结构经典算法面试题

    转自:http://hi.baidu.com/geogre_jsj/blog/item/e4b98fd2aab5aa3611df9b92.html 由于这些题,实在太火了.所以,应广大网友建议要求,在 ...

最新文章

  1. Mybatis实现多表关联多条件查询
  2. 开源学习管理系统(LMS)的比较
  3. android客户端cookies,android – 将cookie添加到客户端请求OkHttp
  4. Linux7/Redhat7/Centos7 安装Oracle 12C_系统安装_01
  5. 为什么安装了cmpp没法拖到工具栏_软件SU:简介、安装以及设置
  6. 从github上下载单个文件
  7. mysql myflash原理_如何利用 Myflash 解析 binlog ?
  8. matlab去趋势,[转载]使用Matlab对数据进行去趋势(detrend)
  9. windows2003在打‘SP2’补丁时提示“拒绝访问”
  10. 控制器发生异常 eofexception_关于气动薄膜调节阀常发生的故障你可能还不知道...
  11. Security+ 学习笔记29 虚拟化
  12. 计算机专业学生实习目的,计算机专业应届毕业生实习目的
  13. 看看故障诊断文献中的故障设置方法-中文论文篇
  14. 分享一个更高效的数据清理方法,建议收藏
  15. ABP module-zero +AdminLTE+Bootstrap Table+jQuery权限管理系统第十二节--小结,Bootstrap Table之角色管理
  16. 使用SP Racing F3飞控ROSflight软件包的无人机自主飞行系统
  17. 国内怎么captcha测试_通过简单的数字测试或PHP图像处理使CAPTCHA更友好
  18. 关于ZIGBEE的CC2530+RFX2401C协议栈的修改
  19. 名词、指示代词和不定代词、形容词、副词
  20. 霍夫曼树(赫夫曼树、哈夫曼树)

热门文章

  1. 使用Docker搭建实验室共享GPU服务器
  2. 选择粘贴性无html,office无法复制粘贴-Word把内容从一个文档选择性粘贴到另一个文档,具体操作方法...
  3. EXCEL所有单元格加减乘除一个数 -- 选择性粘贴的用法
  4. windows 两台电脑通过移动热点传输文件
  5. 【分析】云硬盘的Burst功能
  6. ACS高级计算机科学,2018-2019澳洲八大ACS认证学位全盘点!③
  7. [鼠标指针][仅需1步]宝藏的猫咪Cat老师[win10/11][点击看更多免费]......
  8. 编写一个程序,将两个字符串连接起来,不要用strcat 或 strncat 函数。
  9. 印度人为什么立刀切菜_印度人的刀功有多厉害?看到一刀刮掉的鱼鳞和碎洋葱,我彻底服了...
  10. 大型网站架构系列:电商网站架构案例