题目“解密QQ号”

来源:互联网 发布:大数据分析与挖掘论文 编辑:程序博客网 时间:2024/05/17 09:13

一、问题重述:

新学期开始了,小哈是小哼的新同,小哼向小哈询问QQ号,小哈当然不会直接告诉小哼。所以小哈给了小哼一串加密过的数字,同时小哈也告诉了小
哼解密规则。规则是这样的:首先将第1个数删除,紧接着将第2个数放到这串数的末尾,再将第3个数删除并将第4个数再放到这串数的末尾,再将第
5个数删除……直到剩下最后一个数,将最后一个数也删除。按照刚才删除的顺序,把这些删除的数连在一起就是小哈的QQ啦。现在你来帮帮小哼吧。
小哈给小哼加密过的一串数是“6 3 1 7 5 8 9 2 4”。解密后小哈的QQ号应该是“6 1 5 9 4 7 2 8 3”。

Input

只有2行第1行有一个整数n (1<=n<=100000)第2行有n个整数为加密过的QQ号,每个整数之间用空格隔开。每个整数在1~9之间。

Output

只有一行,输出解密后的QQ号。

Sample Input

96 3 1 7 5 8 9 2 4

Sample Output

6 1 5 9 4 7 2 8 3

二、解题:

首先是解决上述问题的代码,运用LinkedList创建一个list链表,通过调用list的pollFirst()、isEmpty()、
add()的方法完成:
import java.util.LinkedList;import java.util.Scanner;public class Demo {public static void main(String[] args) {Scanner cin=new Scanner(System.in);int n=cin.nextInt();LinkedList<Integer> list=new LinkedList<Integer>();for(int i=0;i<n;i++)list.add(cin.nextInt());while(!list.isEmpty()){System.out.print(list.pollFirst()+" ");if(list.isEmpty())break;list.add(list.pollFirst());}cin.close();}}

三、拓展:

对于心细的小伙伴会联想到如果想要的得到按照排列(例如:1 2 3 4 5 6 7 8 9)的号,那么它按照上述规
则加密处理后的数字串是什么;其实这样的加密问题可以把解密过程颠倒过来就好了,按从大到小的顺序从有序数号中
取回最大一个号放好索引0,然后再取回顺序号中剩下的号中最大的号进行头插法插入进来,然后将尾部的号移到最前面,
继续取回顺序号中剩下的号中最大的号进行头插法插入进来,然后将尾部的号移到最前面,不断重复,直到顺序号被全部
取回来,代码如下:

import java.util.Arrays;import java.util.LinkedList;import java.util.Scanner;public class Demo {public static void main(String[] args) {Scanner cin=new Scanner(System.in);int n=cin.nextInt();int a[]=new int[n];LinkedList<Integer> list=new LinkedList<Integer>();for(int i=0;i<n;i++)a[i]=cin.nextInt();Arrays.sort(a);int j=n-1;list.addFirst(a[j--]);while(j>=0){list.addFirst(list.pollLast());list.addFirst(a[j--]);}for(int t:list)System.out.print(t+" ");cin.close();}}

四、总结

上述两段代码的过程正好是互为逆过程,这样就组成了一个简单的qq号加密与解密的过程啦!说白了,只要
学会对链表的操作,还是很简单的啦!

原创粉丝点击