`
dandy
  • 浏览: 67256 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

差是几个

    博客分类:
  • java
阅读更多
出自《java puzzle》

下面的程序在计算一个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;这会使它变成一个八进制字面常量。有意识地使用八进制整型字面常量的情况相当少见,你应该对所有的这种特殊用法增加注释。对语言设计者来说,在决定应该包含什么特性时,应该考虑到其限制条件。当有所迟疑时,应该将它剔除在外。
3
2
分享到:
评论

相关推荐

    PHP计算两个日期相差几个月多余几天

    PHP计算两个日期相差几个月多余几天

    差分信号PCB布局布线时的几个常见误区

    本文将详细介绍几个关于差分信号PCB布局布线时的常见误区,并提供相应的解决方案。 误区一:错误理解差分信号的回流路径 一个常见的误区是认为差分信号不需要地平面作为回流路径,或者认为差分走线彼此为对方提供...

    PCB设计中对差分走线的几个误区

    ### PCB设计中对差分走线的几个误区详解 #### 一、差分信号概述及其优势 差分信号(Differential Signal)作为一种重要的信号传输方式,在高速电路设计中扮演着核心角色。差分信号通常由一对走线构成,这两条走线...

    Matlab图像处理的常用几个方法并附有帧差法

    本篇文章将详细讲解MATLAB在图像处理中的几个常见方法,并重点探讨帧差法的应用。 首先,我们要理解MATLAB在图像处理中的基本操作。图像在MATLAB中通常被表示为二维矩阵,其中的每个元素对应图像的一个像素值。我们...

    差分阻抗-什么是差分?

    为了全面了解差分阻抗,我们需要从几个方面来探讨这个主题:差分信号的基础、差分阻抗的定义、差分阻抗的计算方法、以及差分阻抗与共模阻抗的关系。 首先,差分信号是一种传输方式,在这种模式下,信号由两条相互...

    差分信号PCB布线中容易出现的几个经典误区

    以下是三个在差分信号PCB布局布线中容易出现的误区,以及对应的正确设计方法。 误区一:差分信号不需要地平面作为回流路径 在差分信号传输中,即便差分电路对地弹和电源/地平面噪声不敏感,但并不意味着差分走线不...

    等差数列前+n项和定理的几个推广定理及运用_数学等差数列论文毕业设计范文.pdf

    接下来,我们讨论几个等差数列前n项和定理的推广定理: 1. 定理1:设等差数列\(\{a_n\}\)的公差为\( d \),其前n项和为\( S_n \),则数列\(\{S_n\}\)是一个公差为\( 2d \)的等差数列。 这个定理的证明主要利用\( S...

    AD.zip_AD差分采样_差分_差分 ad_差分AD 采集_差分ad stm32

    这种方法有以下几个显著的优点: 1. 抗干扰能力更强:差分采样可以有效地抵消共模噪声,因为共模噪声在两个输入端同时存在,但在差分计算时会被减去。 2. 提高精度:由于测量的是电压差,而非绝对电压,差分采样...

    Java 计算日期月差

    计算两日期之间的差,看看两日期之间能差几个月的问题

    java实现两个时间相差的年月日 (相差几年几天几日的结果)

    网上很多资源都没有输出结果是(相差几年几个月几天的代码)希望对大家有帮助 有不足地方 望大家多多指点

    差分方程建模

    通过建立一个或几个离散变量取值所满足的平衡关系,从而建立差分方程。差分方程模型可以近似于某个微分方程模型,实际上,连续变量可以用离散变量来近似和逼近。差分方程模型有着非常广泛的实际背景,可以适当地用差...

    java中计算两个日期相差几天

    ### Java中计算两个日期相差几天 在Java编程中,经常需要处理与日期和时间相关的操作。其中一项常见的需求就是计算两个日期之间的差距。本篇文章将详细介绍如何在Java中计算两个日期相差几天,并深入探讨示例代码中...

    java时间差

    在Java编程语言中,处理时间差是一个常见的任务,特别是在需要计算两个日期或时刻之间间隔的场景下。本文将深入探讨Java中的时间差处理方法,包括基础API、Java 8引入的日期时间API以及一些实用技巧。 1. **基础API...

    差分包生成工具

    差分包生成的过程通常涉及以下几个步骤: 1. **对比分析**:首先,需要获取到新旧两个版本的apk文件。通过对这两个apk进行二进制级别的对比,找出文件内容的差异。这个过程可以通过计算文件的哈希值或者直接比较...

    背景提取matlab,帧差法(213426).zip_MATLAB背景差法_matlab 帧差法_matlab帧差法_背景差法_

    2. **初始化背景图像**:通常选取视频的前几帧(如前5帧)作为背景模型,平均这些帧的灰度值可以得到一个初始背景图像。 3. **帧差计算**:对每一对连续帧,计算它们之间的绝对差或平方差,生成差分图像。差分图像中...

    和差波束测角

    MATLAB是进行信号处理和仿真分析的强大工具,对于和差波束测角的实现,主要涉及以下几个步骤: 1. **信号生成**:首先,需要生成模拟的入射信号,这些信号带有不同的角度信息。 2. **采样与量化**:将连续信号转换...

    GNSS数据处理中双差残差恢复单差残差的原理分析.pdf

    在介绍GNSS数据处理中双差残差恢复单差残差的原理之前,我们先明确几个关键概念。全球卫星导航系统GNSS,是一种可以提供实时、全天候和全球性的导航服务,用于连续地定位和定时的卫星系统。数据处理是指对收集到的...

    计算两个时间相差几年几月

    用于计算两个时间的差值,非常实用!

Global site tag (gtag.js) - Google Analytics