金色十月线上编程比赛第二题:解密 csdn

最近几天没什么事,偶然看见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;
	}
}


总结起来这个题并不难,单有很多地方需要注意。在关键地方我都有注释,如果有什么问题,可以留言。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值