最近几天没什么事,偶然看见csdn上面有高效俱乐部挑战题就做了一个
要求及题意描述:小强是一名学生, 同时他也是一个黑客。 考试结束后不久,他惊讶的发现自己的高等数学科目居然挂了,于是他果断入侵了学校教务部网站。在入侵的过程中,他发现了与成绩相关的内容是一个加密文件,这个文件由 n 个数构成,经过分析,这个加密文件的密钥为这 n 个数中二进制位数 1 最少的数。但由于数比较多,小强 希望你能帮他得到密钥,好在成绩公布之前将成绩改过来。 输入描述: 输入由多组数据构成,每组数据第一行为一个数 n(1<=n<=10^5),表示数的数量,第二行 n 个整数表示文件中的每个数(1<=每个数<=10^9)。以文件结尾。 输出描述: 对于每组数据输出一行,先输出数据组数,再输出二进制中含 1 最少的数,如果有多个数符合条件,输出最小的那个。
下面是我的解法:
package com.junl.scott.goldenfulantumn;
import java.util.ArrayList;
import java.util.List;
public class TwoDecryption
{
public static void main(String[] args)
{
// 定义接收返回值
FormatNumber formatNumber = new FormatNumber();
List<FormatNumber> formatNumberList = TwoDecryption.initDecimalismToBinary();
formatNumber = TwoDecryption.getNumber(formatNumberList);
System.out.println(formatNumber.getRealNumber());
System.out.println(formatNumber.getBinaryNumber());
System.out.println(formatNumber.getNumberOfOne());
}
public static FormatNumber getNumber(List<FormatNumber> formatNumberList)
{
// 定义返回值
FormatNumber formatNumber = null;
// 获取比较的参数
FormatNumber formatNumberFor = null;
// 获取第一个数字
formatNumber = formatNumberList.get(0);
// 循环比较
for (int i = 1; i < formatNumberList.size(); i++)
{
// 获取当前值
formatNumberFor = formatNumberList.get(i);
// 判断当1的个数小于时
if (formatNumberFor.getNumberOfOne() < formatNumber.getNumberOfOne())
{
formatNumber = formatNumberFor;
}
// 当1的个数等于并且真实数字小于时
if (formatNumberFor.getNumberOfOne() == formatNumber.getNumberOfOne() && formatNumberFor.getRealNumber() < formatNumber.getRealNumber())
{
formatNumber = formatNumberFor;
}
}
return formatNumber;
}
/*
* 格式化变化后的列表
*/
public static List<FormatNumber> initDecimalismToBinary()
{
InitNumber initNumber = new InitNumber();
FormatNumber formatNumber = null;
List<FormatNumber> formatNumberList = new ArrayList<FormatNumber>();
TwoDecryption twoDecryption = new TwoDecryption();
List<Integer> numberDetail = new ArrayList<Integer>();
numberDetail.add(3);
numberDetail.add(4);
numberDetail.add(5);
numberDetail.add(6);
numberDetail.add(7);
initNumber.setNumber(5);
initNumber.setRealNumber(numberDetail);
List<Integer> numberList = new ArrayList<Integer>();
numberList = initNumber.getRealNumber();
for (int j = 0; j < numberList.size(); j++)
{
formatNumber = new FormatNumber();
formatNumber.setRealNumber(numberList.get(j));
formatNumber.setBinaryNumber(twoDecryption.decimalismToBinary(formatNumber.getRealNumber()));
formatNumber.setNumberOfOne(twoDecryption.numberOfOne(formatNumber.getBinaryNumber()));
/*
* 和上面add方法的区别 在指定的位置插入数据 formatNumberList.add(formatNumber);
*/
formatNumberList.add(j, formatNumber);
}
return formatNumberList;
}
/*
* 十进制转二进制
*/
public String decimalismToBinary(int realNumber)
{
return Integer.toBinaryString(realNumber);
}
/*
* 获取二进制字符串中1的个数
*/
public int numberOfOne(String resutl)
{
int numberOfOne = 0;
for (int i = 0; i < resutl.length(); i++)
{
if ('1' == (resutl.charAt(i)))
{
numberOfOne += 1;
}
}
return numberOfOne;
}
}
/*
* 初始化的数字
*/
class InitNumber
{
int number;
List<Integer> realNumber = new ArrayList<Integer>();
public int getNumber()
{
return number;
}
public void setNumber(int number)
{
this.number = number;
}
public List<Integer> getRealNumber()
{
return realNumber;
}
public void setRealNumber(List<Integer> realNumber)
{
this.realNumber = realNumber;
}
}
/*
* 格式化以后的数字 真正的数字 二进制数 包含1的数量
*/
class FormatNumber
{
int realNumber;
String binaryNumber;
int numberOfOne;
public int getRealNumber()
{
return realNumber;
}
public void setRealNumber(int realNumber)
{
this.realNumber = realNumber;
}
public String getBinaryNumber()
{
return binaryNumber;
}
public void setBinaryNumber(String binaryNumber)
{
this.binaryNumber = binaryNumber;
}
public int getNumberOfOne()
{
return numberOfOne;
}
public void setNumberOfOne(int numberOfOne)
{
this.numberOfOne = numberOfOne;
}
}
总结起来这个题并不难,单有很多地方需要注意。在关键地方我都有注释,如果有什么问题,可以留言。