开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第21天,点击查看活动详情
现有一串数字,按照一定规则对数字进行加密,得到加密后的数字,求原数字。(解密过程)
加密规则:首先把第一个数删除,接着把第二个数放到数字末尾,继续删除第三个数,把第四个数放到末尾,再把第五个.....按照删除的顺序把数字连起来就是我们要找的了。
测试:
输入:631758924
输出:615947283
其实这个解密过程就像是“排队”,每次拿最前面两个,第一个丢掉,第二个放到尾部,那么编程如何实现呢?
首先,我们需要考虑数据的存储,这里我们用数组存储,并且对数组进行初始化。比如我们声明 int[] num=new int[101]; 你可能会奇怪,为什么明明9个数字,要很多个个空间存储呢?因为我们后面倍数还有添加,我们之间在一个数组完成
怎么删除第一个数?最简单方式就是数组每一个数都往前移动一位,把前面的覆盖。这里我们引入两个整形变量head,tail,head记录队首,即第一位,tail用来记录队尾下一个位置. 为什么还会是队尾下一个而不是队尾呢?这是因为当队列中只剩下一个元素时候,队首和队尾重合会带来一些麻烦,所以我们这里规定队首和队尾重合时候,队列为空。
此时head和tail之间的数就是有效数,如果删除一个数,head++就可以,新增一个元素,直接把元素放到队尾,然后tail++就可以了。
那如何书写代码:
public static void main(String[] args) {
Scanner reader = new Scanner(System.in);
int n = reader.nextInt();
int a[] = new int[102];
int head=0;
int tail=n;
for(int i=0;i<n;i++){
a[i]=reader.nextInt();
}
while(tail>head){
//删除队首数字
System.out.printf("%d ", a[head]);
head++;
//将数字移动到队尾
a[tail]=a[head];
tail++;
//再将队首出队
head++;
}
}
这里我们可以对队列元素做封装:
那么java里面是靠什么加密解密的呢?
1.base64
Base64 编码是我们程序开发中经常使用到的编码方法,它用 64 个可打印字符来表示二进制数据。这 64 个字符是: 小写字母 a-z、大写字母 A-Z、数字 0-9、符号"+"、"/",其他所有符号都转换成这个字符集中的字符。Base64 编码通常用作存储、传输一些二进制数据编码方法,所以说它本质上是一种将二进制数据转成文本数据的方案。
通常用作对二进制数据进行加密
加密: 输入byte数组,返回:(new BASE64Encoder()).encode(数组)
解密:输入字符串,返回:(new BASE64Decoder()).decodeBuffer(字符串)
2.MD5
MD5 是将任意长度的数据字符串转化成短小的固定长度的值的单向操作,任意两个字符串不应有相同的散列值。因此 MD5 经常用于校验字符串或者文件.
MD5 主要用做数据一致性验证、数字签名和安全访问认证,而不是用作加密。比如说用户在某个网站注册账户时,输入的密码一般经过 MD5 编码,更安全的做法还会加一层盐(salt),这样密码就具有不可逆性。然后把编码后的密码存入数据库,下次登录的时候把密码 MD5 编码,然后和数据库中的作对比,这样就提升了用户账户的安全性。
是一种单向加密算法,只能加密不能解密
3.SHA
SHA全名叫做安全散列算法,是FIPS所认证的安全散列算法。能计算出一个数字消息所对应到的,长度固定的字符串(又称消息摘要)的算法。且若输入的消息不同,它们对应到不同字符串的机率很高。
数字签名等密码学应用中重要的工具,被广泛地应用于电子商务等信息安全领域
不全面,只是列举常用的