package beautyOfCoding;
import java.util.Arrays;
public class TheLostID {
/*编程之美
假设一个机器仅存储一个标号为ID的记录,假设机器总量在10亿以下且ID是小于10亿的整数,假设每份数据保存两个备份,这样就有两个机器存储了同样的数据。
1.假设在某个时间得到一个数据文件ID的列表,是否能快速地找出表中仅出现一次的ID?即快速找出出现故障的机器存储的数据ID。
2.如果有两台机器出现故障呢?(假设存储同一份数据的两台机器不会同时出现故障,即列表中缺少的是两个不等的ID)
这里只考虑第2个问题:有两台机器出现故障,且缺少的是两个不等的ID
书上的解法4通过构造方程来解答,这有个前提是,需要知道所有的ID
我认为解法三(异或)更好
以下是解法三的实现
*/
public static void main(String[] args) {
int[] c = {1,2,3,4,10,1,2,3,6,6};//ID列表
TheLostID lostID = new TheLostID();
lostID.process(c);
}
public void process(int[] c){
if(c==null||c.length<4){//ID列表至少应该有4个ID
return;
}
if(this.isValidInput(c)){
this.find(c);
}
}
/*
例如,对于数组{1,2,3,4,10,1,2,3},所有数字异或的结果是:
xor=4^10=(1110)-->最低位的1在倒数第二位(这个位置记为i位),表示4和10在i位是不相等的
那么,数组里面的数字可分为两组:一组是在i位上为1,另一组为0
让这两组数字各自内部异或,则能找到只出现一次的4和10
*/
public void find(int[] c){
int len=c.length;
int xor=0;
for(int i=0;i<len;i++){
xor ^=c[i];
}
int xor2=xor&(xor-1);//去掉xor二进制表示里面最低位的1
int lastDiffBit=xor^xor2;//x,y在这一位是不相等的,一个为0,一个为1
int x=0;
int y=0;
for(int i=0;i<len;i++){
if((c[i]&lastDiffBit)==lastDiffBit){
x ^=c[i];
}else{
y ^=c[i];
}
}
System.out.println("x,y="+x+","+y);
}
/*
判断数组是否符合以下条件:
1、数组里面的数字,要么出现一次,要么出现两次
2、出现一次的数字,有且只有两个
最快的方法当然是用哈希表
这里用的是 排序+遍历统计(如果数据量大,用排序也不如哈希表好)
*/
public boolean isValidInput(int[] c){
Arrays.sort(c);//排序
int len=c.length;
int count=0;
if(c[0]!=c[1]){
count++;
}
if(c[len-1]!=c[len-2]){
count++;
}
for(int i = 0;i<len;i++){
if(i<=len-3){
if(c[i]==c[i+1]&&c[i+1]==c[i+2]){//不能存在三个相等的数
return false;
}
}
//统计不相等的数有几个
if(0<i&&i<len-1&&c[i]!=c[i-1]&&c[i]!=c[i+1]){
count++;
}
if(count>2){
return false;
}
}
return count==2;
}
}
分享到:
相关推荐
通过SOM网络的训练,我们可以将这些高维数据聚类,找出不同故障模式的特征表示,从而实现故障的自动识别和分类。 描述中提到MATLAB智能算法,意味着整个分析过程可能使用了MATLAB编程环境。MATLAB是科学计算的强大...
- **定义**: 故障定位是指通过一系列的方法和技术手段,精确地找出导致服务器故障的具体位置或部件。 - **常用手段**: - POST过程的分析。 - 使用硬件手册中的指导信息。 #### 三、POST过程分析 - **定义**: ...
在机械故障诊断中,CEEMDAN能够将复杂的非线性、非平稳信号分解为一系列简单易理解的本征模态函数(IMFs),从而帮助分析设备的振动或声音信号,找出异常模式,为故障定位提供依据。 2. **MSE(多尺度熵)**:多...
物品-物品协同过滤则基于用户对不同物品的评分,找出相似的物品并进行推荐。 吴恩达教授的课程可能涵盖以下技术点: 1. **异常检测算法**: - **K-means聚类**:将数据点分配到最近的聚类中心,异常值通常位于...
- **调试**:使用IDE(集成开发环境)和调试工具如GDB,帮助找出并修复源码中的错误。 - **软件框架**:源码往往基于某种软件框架编写,如Spring Boot for Java,提供了一套完整的开发结构和功能。 2. **驱动程序...
频域分析则采用傅立叶变换将时域信号转化为频域信号,通过分析频谱分布找出故障特征频率,如转速频率、齿轮啮合频率、轴承故障频率等。 此外,故障特征识别也是系统的重要组成部分。这可能涉及到模式识别、机器学习...
- **CPU耗时分析**:找出消耗CPU最多的代码段。 - **内存分析**:检查是否存在内存泄漏,以及对象生命周期是否正常。 - **锁竞争**:分析线程竞争状态,优化同步机制。 7. **JVM内存溢出** - **堆溢出**:过多...
在实际应用中,这个故障诊断系统能够显著减轻网络优化人员的工作负担,他们不再需要手动检查大量数据来找出问题,而是可以通过系统快速定位并解决故障。同时,这也有助于网络运营商降低维护成本,提高网络运行效率。...
手册可能会介绍如何进行调试,找出并修复可能出现的问题,以确保HMI的稳定运行。 6. **实时数据监控**:屏通人机界面往往具备实时数据监控功能,允许操作人员查看设备的运行状态和报警信息。这部分内容可能涵盖如何...
通过查看过去的维修记录,可以找出故障发生的规律,提高故障排除效率。同时,系统和控制器的日志信息能提供详细的运行状态和错误信息,为诊断提供直接线索。 总的来说,数控机床故障诊断是一个综合性的过程,需要...
首先,故障特征提取是故障诊断过程中的关键步骤,其目的是从大量的原始数据中找出能够表征设备或系统故障模式的信息。这通常涉及到信号处理、模式识别和统计分析等技术。MATLAB提供了丰富的工具箱,如Signal ...
- **调试技巧**:学会使用断点、单步执行、查看变量状态等调试方法,有助于找出和修复代码中的问题。 在“AVR编程软件”的压缩包中,可能包含了这些组件的安装文件、教程文档、示例代码或其他辅助资源。安装并熟悉...
在这个案例中,SOM神经网络首先会对柴油机的运行数据进行学习,找出不同工况下的特征模式。接着,当新的数据输入时,SOM会将它们映射到网络的二维平面(也称为地图)上,形成一个可视化表示。通过分析这些映射位置,...
3. **训练SVM**:使用训练数据拟合SVM模型,找出最优超平面。 4. **模型验证**:在测试集上评估模型的性能,常用指标有准确率、精确率、召回率和F1分数。 5. **模型优化**:根据验证结果调整模型参数,如正则化参数C...
5. **测试与调试**:在实际应用中,需要对LED灯串进行反复测试,确保颜色渐变效果满足预期,同时使用调试工具检查程序执行情况,找出并修复潜在问题。 总的来说,"WS2812-渐变色编程-STC12C5A60S2.zip"这个项目涉及...
NJ是OMRON大型PLC”表明该手册不仅包含故障诊断的步骤,还包括代码查询,用以帮助维修人员快速定位问题并找出解决方案。OMRON大型PLC在工业自动化领域应用广泛,因此故障排除手册对于工程师维护机器和系统来说至关...
通过信号分析,可以识别出故障信号的特征模式,帮助定位问题的源头。 3. **故障信号处理**:这是一个更具体的技术步骤,涉及数据预处理、滤波、降噪、特征提取等多个环节。数据预处理是为了消除噪声和不稳定性;...
频谱图则能揭示信号的频率分布,找出故障模式可能对应的特征频率,比如滚动轴承的固有频率、旋转频率、径向频率等。 "实际采集的真实数据"强调了这些数据的实用性和可靠性,它们不是模拟生成的,而是从真实设备上...
在遇到SVM故障时,libsvm提供了一些内置的诊断工具和日志信息,帮助用户分析模型的性能和找出可能的问题。例如,它会记录训练过程中的警告和错误信息,以及最终模型的统计信息,如支持向量的数量和目标函数的值。...