下面的程序在计算一个int数组中的元素两两之间的差,将这些差置于一个集合中,然后打印该集合的尺寸大小。那么,这个程序将打印出什么呢?


import java.util.*;public class Differences {public static void main(String[ ] args) { int vals[ ] = { 789, 678, 567, 456, 345, 234, 123, 012 }; Set diffs = new HashSet(); for (int i = 0; i < vals.length; i++) for (int j = i; j < vals.length; j++) diffs.add(vals[i] - vals[j]); System.out.println(diffs.size()); } } 

外层循环迭代数组中的每一个元素,而内层循环从外层循环当前迭代到的元素开始迭代到数组中的最后一个元素。因此,这个嵌套的循环将遍历数组中每一种可能的两两组合。(元素可以与其自身组成一对。)这个嵌套循环中的每一次迭代都计算了一对元素之间的差(总是正的),并将这个差存储到了集合中,集合是可以消除重复元素的。因此,本谜题就带来了一个问题,在由vals数组中的元素结成的对中,有多少唯一的正的差存在呢?

当你仔细观察程序中的数组时,会发现其构成模式非常明显:连续两个元素之间的差总是111。因此,两个元素之间的差是它们在数组之间的偏移量之差的函数。如果两个元素是相同的,那么它们的差就是0;如果两个元素是相邻的,那么它们的差就是111;如果两个元素被另一个元素分割开了,那么它们的差就是222;以此类推。看起来不同的差的数量与元素间不同的距离的数量是相等的,也就是等于数组的尺寸,即8。如果你运行该程序,就会发现它打印的是14。怎么回事呢?

上面的分析有一个小的漏洞。要想了解清楚这个缺陷,我们可以通过将println语句中的.size()这几个字符移除掉,来打印出集合中的内容。这么做会产生下面的输出:


[111,222,446,557,668,113,335,444,779,224,0,333,555,666] 

这些数字并非都是111的倍数。在vals数组中肯定有两个毗邻的元素的差是113。如果你观察该数组的声明,不可能很清楚地发现原因所在:


int vals[ ] = { 789, 678, 567, 456, 345, 234, 123, 012 }; 

但是如果你打印数组的内容,你就会看见下面的内容:


[789,678,567,456,345,234,123,10] 

为什么数组中的最后一个元素是10而不是12呢?因为以0开头的整数类型字面常量将被解释成为八进制数值[JLS 3.10.1]。这个隐晦的结构是从C编程语言那里遗留下来东西,C语言产生于1970年代,那时八进制比现在要通用得多。

一旦你知道了012 == 10,就会很清楚为什么该程序打印出了14:有6个不涉及最后一个元素的唯一的非0差,有7个涉及最后一个元素的非0差,还有0,加在一起正好是14个唯一的差。订正该程序的方法更加明显:将八进制整型字面常量012替换为十进制整型字面常量12。如果你这么做了,该程序将打印出我们所期望的8。

本谜题的教训很简单:千万不要在一个整型字面常量的前面加上一个0;这会使它变成一个八进制字面常量。有意识地使用八进制整型字面常量的情况相当少见,你应该对所有的这种特殊用法增加注释。对语言设计者来说,在决定应该包含什么特性时,应该考虑到其限制条件。当有所迟疑时,应该将它剔除在外。

转载于:https://www.cnblogs.com/yuyu666/p/9840993.html

谜题59:什么是差?相关推荐

  1. Java解惑 电子书

    --表达式谜题 Java 谜题 1--表达式谜题 谜题 1:奇数性 下面的方法意图确定它那唯一的参数是否是一个奇数.这个方法能够正确运转 吗? public static boolean isOdd( ...

  2. java---解惑--

    Java谜题1--表达式谜题 谜题1:奇数性 下面的方法意图确定它那唯一的参数是否是一个奇数.这个方法能够正确运转吗? public static boolean isOdd(int i){  ret ...

  3. 听说火狐要换Logo,网友们掀起了一场“战争”

    本文转载自程序员的那些事. 企业或产品的LOGO,是一种独有且特异的标志,能够最直观且最形象地体现企业及产品的功能与风貌.如果企业及产品的功能有所变化或升级,LOGO也会顺着这波趋势有所改变:至于时刻 ...

  4. TSDB学习 ---- Facebook TSDB 论文翻译

    转载:https://developer.aliyun.com/article/174535 本文为Facebook官方论文的翻译,原文地址http://www.vldb.org/pvldb/vol8 ...

  5. 听说火狐浏览器的图标里没了狐狸,网友们开始了反极简主义斗争

    "请您坐到设计师工位上来." 1 企业或产品的LOGO,是一种独有且特异的标志,能够最直观且最形象地体现企业及产品的功能与风貌.如果企业及产品的功能有所变化或升级,LOGO也会顺着 ...

  6. 一个关于中国省市区的字典,数组嵌套使用

    第一步: 去云盘的资料目录下下载一个名字为area.txt的文件(内容为中国的省市区),将这个文件导入到自己的工程里(导入时会有一个界面,勾选copy items if needed) //    第 ...

  7. 编程的乐趣:用Python解算法谜题 课后习题答案

    说明:作者已经给了各章习题1的答案,其他的习题答案我来补充下,使用语言为Python3,有问题欢迎留言. 附习题一答案:https://mitpress.mit.edu/books/programmi ...

  8. python时区转换_在python 不同时区之间的差值与转换方法

    之前有个程序,里面有个时间部分是按照国内时区,也就是东八区,来写的,程序中定义了北京时间2点到八点进行检查:后面程序在国外机器上,例如说韩国,欧美等,执行的时候发现会有时间上的问题,因为获取的是机器的 ...

  9. mysql 月份差_MySQL时间差返回月个数

    Sql代码   select PERIOD_DIFF(date_format(now(),'%Y%m'),date_format('2010-11-30','%Y%m')) 1. MySQL 为日期增 ...

最新文章

  1. 没有会员wps合并多个sheet_WPS「合并文档」功能,如何“唰”一下把多个文档合并到一起?...
  2. mariadb CTE示例
  3. 具体knn算法概念参考knn代码python实现
  4. CF1580C Train Maintenance(分块)
  5. linux看系统硬件,Linux 查看系统硬件信息(实例详解)
  6. python except用法和作用_Python面试题(部分附带面试标准答案) 建议收藏
  7. eclipselink mysql_Eclipselink更新现有表
  8. 如何利用python实现qq聊天_用Python写一个模拟qq聊天小程序的代码实例
  9. [转载] 七龙珠第一部——第029话 冒险再度开始
  10. HDU1054 Strategic Game —— 最小点覆盖 or 树形DP
  11. 数据结构与算法(C语言版)——陈越
  12. 2022年高压电工考试模拟100题及在线模拟考试
  13. ie html保存为pdf文件,IE浏览器怎么将网页保存为pdf文档?将网页保存为pdf文档的方法说明...
  14. 科学计算机DEG进入,科学计算器的使用方法(5页)-原创力文档
  15. c语言程序设计第六章习题答案,C语言程序设计(第2版) 刘克威,张凌晓著 习题答案-第六章...
  16. CSS+CSS3超详细教程
  17. 脾气暴躁的 Linus 不大可能开喷修改 master
  18. 《WEB开发-阿里云建站》第1章 建站前的准备
  19. 十五款固态硬盘收获季节展示
  20. sonarqube如何导入规则_sonar如何添加自定义JAVA规则

热门文章

  1. CleanMyMac扩展管理功能
  2. 怎样用VB编写.DLL动态链接库文件
  3. Javascript中使用WScript.Shell对象执行.bat文件和cmd命令
  4. h3c 3600 acl 配置 滤源IP是网关的ARP报文的ACL规则
  5. android设备未指定怎么办,APKpath未指定为模块“示例 – 示例”
  6. 用Python从零开始创建区块链
  7. github充当服务器_如何创建充当链接HTML按钮
  8. 初学者如何学Java开发
  9. 什么样的人适合学习UI?
  10. 6.2 sql安全性