记录两道面试题:

题目描述:

输入一个链表,输出该链表中倒数第k个结点。(单向链表)

拿到这个问题的时候自然而然会想到让链表从末尾开始next   K-1 次不就是第K-1个节点了么,但是必须要注意一点,这是单向链表。那么这时候的解决思路或许就会出现分歧,大多数人都会想到遍历一下链表,获取链表的长度,然后再减去 K 长度的节点,那么我们这个链表的最后一个节点就是原链表的倒数第K个节点:我们看一下实现代码:

/*** 获取倒数第K个节点的数据* @param index* @return*/public int getDtae(int index){//对整个链表进行遍历int size = 0;Node current = head;//head是头结点while(current!=null){size++;current = current.next;}current = head;//向后遍历size-K获取倒数第K个节点for(int i = 0;i < size - index;i++){current = current.next;}return current.date;}

定义两个节点first和second,他们同时指向head头结点。我们先把第二个节点向后移动index-1步,这时first和second是不是就相距k,我们再把两个节点同时向后移动,当second到达链表尾端的时候,是不是就可以说first的位置就是我们需要的倒数第K个节点。(只遍历一次)

/*** 获取倒数第K个节点的数据* @param index* @return*/public int getDtae(int index){//判断index是否为零或者是小于零的不合法数据if(index <= 0 || head == null){//抛出空指针异常throw new NullPointerException();}//定义两个节点指向headNode first = head;Node second = head;//把第二个节点向后移动k-1步for(int i = 0;i < index - 1;i++){second = second.next;}//再把两个节点同时向后移动,直到second到达尾端位置while(second!=null){first = first.next;second = second.next;}return first.date;}

问题描述:

有一个1GB大小的文件,文件里面每一行是一个词,每个词的大小不超过16B,内存大小限制为1MB,要求返回频数最高的100个词。

分析:

由于文件大小为1GB,而内存的大小只有1MB,因此不能一次把所有的词读入到内存中去处理,可以采用分治的方法进行处理:把一个文件分解为多个小的子文件,从而保证每个文件的大小都小于1MB,进而可以直接被读取到内存中处理。

解题思路:
1、遍历文件,对遍历到的每一个词,执行Hash操作:hash(x)%2000,将结果为i的词存放到文件ai中,通过这个分解步骤,可以是每个子文件的大小约为400KB左右,如果这个操作后的文件大小超过1MB,那么可以使用同样的方法把文件继续进行分解下去,直到文件的大小小于1MB为止。

2、统计出每个文件中出现频率最高的100个词。最简单的就是使用字典来实现,具体方法为:遍历文件中的所有词,对于遍历到的词,如果字典中不存在,则把这个词存入到字典中(键为这个词,值为1),如果这个词已经在字典中,那么把这个词对应的值加一。遍历后可以非常容易的找到出现频率最高的100个词。

3、上一步找出了每个文件中出现频率最高的100个词,这步可以通过维护一个小顶堆来找出所有词中出现频率最高的100个词。遍历第一个文件,把第一个文件中的出现频率最高的100个词构成一个小顶堆。(如果第一个文件中词的数目小于100,那么可以继续遍历第二个文件,直到构建好有100个节点的小顶堆为止)。继续遍历,如果遍历到的词的出现次数大于堆顶上词的出现次数,那么可以用新遍历到的词替换堆顶的词,然后重新调整这个堆为小顶堆。当遍历完所有的文件后,这个小顶堆中的词就是出现频率最高的100个词。当然这一步也可以采用类似归并排序的方法把所有文件中出现次数最高的100个词进行排序,最终找出出现次数最高的100个词。

面试经典:链表中倒数第k个结点?如何从大量数据中找出高频词?相关推荐

  1. 程序员面试题精选100题(09)-链表中倒数第k个结点[数据结构]

    题目:输入一个单向链表,输出该链表中倒数第k个结点.链表的倒数第0个结点为链表的尾指针.链表结点定义如下: struct ListNode {       int       m_nKey;      ...

  2. [剑指offer]面试题15:链表中倒数第k个结点

    面试题15:链表中倒数第k个结点 题目:输入一个链表,输出该链表中倒数第 k 个结点.为了符合大多数人的习惯,本题从1 开始计数,即链表的尾结点是倒数第1 个结点.例如一个链表有6个结点,从头结点开始 ...

  3. 剑指offer面试题[15]-链表中倒数第K个结点

    题目描述 输入一个链表,输出该链表中倒数第k个结点. 思路: 假设链表有n个结点,那么倒数第k个结点就是从头结点开始的第n-k+1个结点,我们只要从头结点开始往后走n-k+1步就可以了.那么问题来了: ...

  4. 剑指offer_第14题_链表中倒数第k个结点_Python

    题目描述 输入一个链表,输出该链表中倒数第k个结点. 理解 链表详解 python数据结构之链表 解题思路 思路1 确定链表种结点个数lenth 倒数第k个结点就是第length-k+1个结点 需要考 ...

  5. 【Java】找到链表中倒数第k个结点

    题目描述 : 输入一个链表,输出该链表中倒数第k个结点. 解题思路 : 1.根据以上链表进行分析 2.算法思想 : 定义两个引用,即快慢指针,都从头节点开始向后走: 要找到倒数第k个节点,即要让快指针 ...

  6. 剑指offer:链表中倒数第k个结点 python实现

    链表中倒数第k个结点 输入一个链表,输出该链表中倒数第k个结点. 解题思路 暴力求解: 判断链表是否为空: 复制链表,遍历一遍统计其长度: 如果长度小于k.则返回None: 否则,返回其长度-k的链表 ...

  7. 【剑指offer-Java版】15链表中倒数第K个结点

    链表中倒数第K个结点:快慢指针解决 需要注意的地方是 1) 可能会存在输入的链表大小小于k 2) 输入的k可能小于等于0 - 所以必须限定k大于0 public class _Q15 {public ...

  8. 剑指Offer_14_链表中倒数第k个结点

    题目描述 输入一个链表,输出该链表中倒数第k个结点. 解题思路 利用两个指针,第一个指针先走k步,然后第二个指针从头开始走,当第一个指针到达最后时,第二个指针指向的结点就是倒数k个.如果第一个指针走到 ...

  9. 【编程题目】输入一个单向链表,输出该链表中倒数第 k 个结点

    第 13 题(链表): 题目:输入一个单向链表,输出该链表中倒数第 k 个结点.链表的倒数第 0 个结点为链表 的尾指针. 链表结点定义如下: struct ListNode { int m_nKey ...

最新文章

  1. react开发心路历程
  2. 4 计算机系统的异步性,计算机操作系统的最基本特征是什么
  3. python怎么分析各个时间段的数据_Python数据分析:Python对Word数据的读写
  4. java 新增的方法外部调用提示不存在_Java面试简答题(一)
  5. 【AtCoder010】A - Addition(奇偶)
  6. 海军装备、舰船电子设备|环境可靠性试验|GJB150A\GJB4
  7. msvcp71.dll、msvcr71.dll丢失解决方法
  8. .NET(C#)下的移动彩信MM7协议研究之路(一:题记)
  9. 用html计算长方形的面积公式,长方形面积公式是什么
  10. 记录一个Kivy在windows上打包的问题
  11. SSH、SSL、TSL
  12. 集美大学第七届团体程序设计天梯赛第二场排位赛题解
  13. 彻底解决“你的时钟快了”问题
  14. jquery获取ip地址
  15. 深度之眼(十七)——Python标准库
  16. html 有序无序列表,无序列表、有序列表和定义列表
  17. STM 32简单编程实例
  18. lg显示器工厂模式怎么进入_aoc显示器如何进入工程模式
  19. linux查看license情况,检查SCL服务状态和License使用情况
  20. CUIT第七届智能小车(基础四轮电磁组)比赛总结

热门文章

  1. Linux中光盘使用的文件类型,linux下mount命令使用详解---linux挂载光盘等文件系统...
  2. cvGEMM()函数(矩阵通用乘法运算)
  3. opencv图像操作:读取,裁剪,保存,缩放,遍历和读取文件夹图片
  4. MFC消息响应函数OnPaint
  5. 图像处理 区域删除_FotoWorks XL( 图像处理软件 )中文版分享
  6. Android 系统开发_四大组件篇 -- Service 解析(用法)
  7. openstack环境准备
  8. 蓄力十年,做一个成就
  9. YII2 Model 类切换数据库连接
  10. ASP.NET Calendar 控件