简述

本算法摘选自啊哈磊所著的《啊哈!算法》第二章第一节的题目——使用队列来解密举例中按照规则加密的QQ号。文中代码使用C语言编写,博主通过阅读和理解,重新由Java代码实现了一遍,意在深刻理解队列这一数据结构的特性和操作方法,并希望能够在这种数据结构的帮助之下,解决其他的类似的能够用队列来解决的问题。

算法题目

给一串加密过的数字,这串数字是美女的QQ号经过某种加密算法得到的,加密规则是这样的:首先将第1个数删除,紧接着将第2个数放到这串数的末尾,再将第3个数删除并将第4个数放到这串数的末尾,再将第5个数……直到剩下最后一个数,将最后一个数也删除,按照刚才删除的顺序,把这些删除的数连在一起就是加密之前的QQ号。现在希望你能够使用一种算法,解答出美女未加密之前的QQ号码。

解答思路

假设给定一个数组array存储这串数字,开始时array[0]删除掉并打印出来,于此同时后面的数字全部往前挪动一个位置,接着array[1]拿出来,array[2]及其以后的位置再往前挪动一个位置,再把array[1]的值加到数组的末尾去,显然,这种思想是对的,但是效率太低下了,能不能有种更好的思路来解决这种问题?

其实解密的过程就像排队一样,前面的先出来(删除),然后每次都有前面的数值往后排(插入到队尾),我们就将这种队形看做是一个队列,再引入两个整型变量head和tail作为队列的辅助指针,head用来指向队列的队首,tail用来指向队列的队尾(最有一个值)的下一个位置(没值),这样可以看到,当队首队尾相等时,说明队列为空。

从队列的角度我们再来看,假设QQ有9个数并放置在数组array构成的队列中,数组从0开始,那么head就指向了array[0]的位置,array[0, 8]共9个数就是有效的数字串,那么tail就指向了array[9]的位置。现在如果要从队列中删除一个数字,head++就实现了,这样head到tail之前仍然是我们想要的数字串;把新增的数字n放到末尾也很简单,只需要array[tail]=n然后tail++就行了,这样指针head和tail之间仍然是我们的数字串,理解起来应该很简单,下面我们通过代码来实现。

代码实现

 public static void main(String[] args) {

     // 假设如下9位QQ号
int[] qq = {6,3,1,7,5,8,9,2,4}; // 使用数组模拟队列
int[] queue = new int[64];
for(int i = 0; i < qq.length; i++) {
queue[i] = qq[i];
} // 头指针在数组第一个位置,尾指针在QQ号所在的最后一个位置即9
int head = 0, tail = 9; while(head < tail) {
// 打印队首并将队首出队
System.out.print(queue[head] + " ");
head++; // 将新队首的数添加到队尾,队尾指针再后移
queue[tail] = queue[head];
tail++; // 将队首出队
head++;
}
}

这里,我们大可以把队列进行封装处理,如下:

 /**
* 自定义队列
*/
class MyQueue {
/**
* 数据列表
*/
int[] data = new int[64];
/**
* 头指针
*/
int head;
/**
* 尾指针
*/
int tail; public MyQueue() {} public MyQueue(int head, int tail) {
this.head = head;
this.tail = tail;
}
}

大家可以试着将封装的队列类引入到上面的程序中来完成这个算法,比较简单这里就不再写了。

学习总结

队列是一种特殊的线性结构,它是由三个基本元素(一个数组,一个头指针和一个尾指针)封装成的一个结构体,它只允许在队列的首部(head)进行删除操作,这称之为“出队”,只允许在队列尾部(tail)进行插入操作,这称之为“入队”,当队列中没有元素时(即head==tail)则称之为空队列,队列的这种特性我们简单称为“先进先出(First In First Out, FIFO)”原则。

参考资料

1、《啊哈!算法》/ 啊哈磊著. 人民邮电出版社

啊哈算法之巧用队列解密QQ号的更多相关文章

  1. 队列——解密QQ号

    队列——解密QQ号 --转自啊哈磊[坐在马桶上看算法]算法4:队列——解密QQ号 新学期开始了,小哈是小哼的新同桌(小哈是个小美女哦~),小哼向小哈询问QQ号,小哈当然不会直接告诉小哼啦,原因嘛你懂的 ...

  2. 队列解密QQ号

    队列解密QQ号 本篇博客主要是<啊哈!算法>的读书笔记,这里做一下记录. 问题场景: 给定一串 QQ 号,631758924,从其中解密出真实的 QQ 号. 解密规则:首先将第一个数删除, ...

  3. 【坐在马桶上看算法】算法4:队列——解密QQ号

            新学期开始了,小哈是小哼的新同桌(小哈是个小美女哦~),小哼向小哈询问QQ号,小哈当然不会直接告诉小哼啦,原因嘛你懂的.所以小哈给了小哼一串加密过的数字,同时小哈也告诉了小哼解密规则. ...

  4. 算法5:队列——解密 QQ 号

    新学期开始了,小哈是小哼的新同桌(小哈是个小美女哦~),小哼向小哈询问 QQ 号,小哈当然不会直接告诉小哼啦,原因嘛你懂的.所以小哈给了小哼一串加密过的数字,同时小哈也告诉了小哼解密规则.规则是这样的 ...

  5. STL容器及算法题:删除奇数的QQ号

    最近思考到这样一个题目:在STL的set和vector容器里存储了1亿个QQ号,编写函数删除奇数QQ号. 1. STL容器简介 首先了解一下 set 和 vector 以及其他类似的 STL 容器: ...

  6. 解密QQ号

    啊哈~ ---------------------------------------------------------- http://bbs.ahalei.com/thread-4489-1-1 ...

  7. 啊哈!算法:解密QQ号

    书中给出的算法有点浪费空间,可以使用循环队列进行改进,这样就不需要使用额外的空间,在原数组的基础上就可以完成解密,代码如下: #include <stdio.h> void decode( ...

  8. 解密QQ——队列

    一.问题引入 小明和小丽同在一个自习室上自习,小明感觉小丽是一个很不错的女孩,于是他鼓足勇气向小丽要QQ号,然而小丽也是个矜持的女孩,当然不会直接告诉他,所以小丽给了小明一串加密过的数字,同时她也告诉 ...

  9. 算法<初级> - 第二章 队列、栈、哈希表相关问题

    算法 - 第二章 数据结构 题目一 用数组实现大小固定的队列和栈(一面题) 数组实现大小固定栈 /*** * size是对头索引(initSize是固定大小) 也是当前栈大小 * size=下个进队i ...

随机推荐

  1. bzoj 3527: [Zjoi2014]力 快速傅里叶变换 FFT

    题目大意: 给出n个数\(q_i\)定义 \[f_i = \sum_{i<j}{\frac{q_iq_j}{(i-j)^2}} - \sum_{i>j}\frac{q_iq_j}{(i-j ...

  2. 【Matlab】调试基础

    1.matlab 调试子程序 在主程序进入子程序前一句加断点,然后step in,可以进入子程序. 但是直接在子程序里设置断点,运行主程序是不能进入子程序的.

  3. 有趣的Javascript:只需一个JS让万恶的IE5、IE6、IE7、IE8全都支持H5原生Canvas绘图(有演示demo)

    该demo支持IE5以上任意内核的浏览器 查看演示demo:支持IE5以上版本的浏览器Canvas绘图demo 补充:chats.js和echarts等图表库也可以使用本方法兼容IE6以上浏览器 1. ...

  4. win764位安装mysql-5.6

    1配置mysql的MYSQL_HOME和PATH 增加环境变量: MYSQL_HOME=D:\mysql-5.6.14-winx64 修改环境变脸: 在path后面增加%MYSQL_HOME%\bin ...

  5. 数据库中rs("ABC")与rs.Fields("ABC").value的差别(Rs是RecordSet对象)

    透过RecordSet取得数据的时候我们要将数据显示出来时,假设字段名称是ABCABCX = rs("ABC")对于RecordSet来说....是把ABC这个[Fileds对象] ...

  6. MFC——4个基本类中的成员函数介绍

    09121852 杜军 机械设计及理论 1. CMainFrame ActivateFrame使框架对用户可视并可用 CalcWindowRect每当主框架窗口的客户区尺寸发生变化或控制条的位置发生变 ...

  7. HDU - 1869 六度分离 Floyd多源最短路

    六度分离 1967年,美国著名的社会学家斯坦利·米尔格兰姆提出了一个名为“小世界现象(small world phenomenon)”的著名假说,大意是说,任何2个素不相识的人中间最多只隔着6个人,即 ...

  8. WPF之触发器

    简单触发器<Window x:Class="WpfApp.Window1" xmlns="http://schemas.microsoft.com/winfx/20 ...

  9. 通过ssh X11转发使用远程gui程序

    ssh协议可以转发X11数据, 从而达到使用远程gui程序的功能, 假定现在有 客服端 C :192.168.0.13 服务器 S :192.168.0.200 首先确保在客服端C 上能够通过 ssh ...

  10. 2014-10-28 NOIP模拟赛

    Porble 1时间与空间之旅(tstrip.*) 题目描述 公元22××年,宇宙中最普遍的交通工具是spaceship.spaceship的出现使得星系之间的联系变得更为紧密,所以spaceship ...