剑指Offer——迅雷笔试题+知识点总结

举报
SHQ1874009 发表于 2020/12/29 23:35:21 2020/12/29
【摘要】 剑指Offer——迅雷笔试题+知识点总结 情景回顾 时间:2016.9.19 19:00-21:00 地点:山东省网络环境智能计算技术重点实验室 事件:迅雷笔试    总体来说,迅雷笔试内容体量不算多,主要分为30道选择题,2道编程题,半小时将选择题做完,1个半小时两道编程题一道29%,一道超时。关键是第二道编程题直接输出错误语句居然通过17%!也是醉了,绝对的判题...

剑指Offer——迅雷笔试题+知识点总结

情景回顾

时间:2016.9.19 19:00-21:00

地点:山东省网络环境智能计算技术重点实验室

事件:迅雷笔试

   总体来说,迅雷笔试内容体量不算多,主要分为30道选择题,2道编程题,半小时将选择题做完,1个半小时两道编程题一道29%,一道超时。关键是第二道编程题直接输出错误语句居然通过17%!也是醉了,绝对的判题系统BUG。

知识点回忆

希尔排序

  给定一数组元素{50,40,95,20,15,70,60,45},经过一趟希尔排序(参考博文剑指Offer--排序算法小结)后,数组元素变为

   [15 40 60 20 50 70 95 45]


  
  1. public static void shellSort(int[] data) {
  2. int j = 0;
  3. int temp = 0;
  4. for (int increment = data.length / 2; increment > 0; increment /= 2) {
  5. for (int i = increment; i < data.length; i++) {
  6. temp = data[i];
  7. for (j = i; j >= increment; j -= increment) {
  8. if(temp < data[j - increment]){
  9. data[j] = data[j - increment];
  10. }else{
  11. break;
  12. }
  13. }
  14. data[j] = temp;
  15. }
  16. for(int a : data)
  17. System.out.print(a + " ");
  18. System.out.println("");
  19. }
  20. }

    WPL、全局变量与局部变量的区别(存储?)

    Java里面“==”与equals()的区别:前者比较的是地址,后者比较的是内容。

    int 是在栈里创建的,Integer是在堆里创建的。栈里创建的变量要比在堆创建的速度快得多。

  根据“静态型变量是存放在内存的数据区中的,它们在程序开始运行前就分配了固定的字节,在程序运行过程中被分配的字节大小是不改变的.只有程序运行结束后,才释放所占用的内存.” 这段话可以得知,全局变量就是所谓的静态变量,存放在栈中。

   Java栈由栈帧元素组成。栈帧由三部分组成:局部变量区、操作数栈、帧数据区。

(Heap)

    Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建;

    Java虚拟机规范描述:所有的对象实例及数组都要在堆上分配;

    Java堆可以处于物理上不连续的内存空间,只要逻辑上连续即可;

(Stack)

 存放基本类型的数据和对象的引用,即存放变量;

 如果存放的是基本类型数据(非静态变量),则直接将变量名和值存入stack中的内存中;

 如果是引用类型,则将变量名存入栈,然后指向它new出的对象(存放在堆中);

  有关堆与栈的区别,详情参见博文《剑指Offer——简述堆和栈的区别》。

编程题

1.LRUCache(29%)

程序流程图(set操作)



  
  1. package cn.edu.ujn.practice;
  2. import java.util.Collections;
  3. import java.util.HashMap;
  4. import java.util.Map;
  5. import java.util.Scanner;
  6. import java.util.regex.Pattern;
  7. /**
  8. *
  9. * @author SHQ
  10. *
  11. LRUCache
  12. 时间限制:C/C++语言 1000MS;其他语言 3000MS
  13. 内存限制:C/C++语言 65536KB;其他语言 589824KB
  14. 题目描述:
  15. 为LRU Cache设计一个数据结构,它支持两个操作:
  16. 1)get(key):如果key在cache中,则返回对应的value值,否则返回-1。
  17. 2)set(key,value):如果key不在cache中,则将该(key,value)插入cache中(注意,如果cache已满,则必须把最近最久未使用的元素从cache中删除);
  18. 如果key在cache中,则重置value的值。
  19. 3)key,value为int型数据。
  20. 输入
  21. 第一行为capacity(capacity>0), 后面输入的每行数据,有两种情况:
  22. 一种有key和value(key,value以空格分隔),这种情况为set数据,一种只有一个key值,这种为get数据。
  23. 输出
  24. 根据给定的capacity和多组测试数据,输出指定key值对应value值,如果该key值不存在,返回-1。
  25. 样例输入
  26. 3
  27. 100 100
  28. 200 200
  29. 300 300
  30. 100 100
  31. 400 400
  32. 100
  33. 200
  34. 300
  35. 500
  36. 样例输出
  37. 100
  38. -1
  39. 300
  40. -1
  41. */
  42. public class XunLei_1 {
  43. public static void main(String[] args) {
  44. StringBuffer sb =new StringBuffer();
  45. Scanner in = new Scanner(System.in);
  46. // 容量
  47. int capacity = in.nextInt();
  48. // 用于接收换行符
  49. in.nextLine();
  50. while (in.hasNextLine()) {
  51. String s = in.nextLine();
  52. if(s == null || s.length() == 0)
  53. break;
  54. sb.append(s + "\r");
  55. }
  56. resolution(capacity, sb.toString());
  57. }
  58. private static void resolution(int capacity, String str){
  59. /* System.out.println(capacity);
  60. System.out.println(str);*/
  61. int index = 0;
  62. Map<Integer, HashMap<String, String>> map = new HashMap<Integer, HashMap<String, String>>();
  63. Map<String, String> mapTmp;
  64. Pattern pat = Pattern.compile("[ ]+");
  65. Pattern pattern = Pattern.compile("[\r]");
  66. String [] sr = pattern.split(str);
  67. boolean flag = false;
  68. for(String s : sr){
  69. // 注意map集合m的创建位置
  70. HashMap<String, String> m = new HashMap<String, String>();
  71. String [] string = pat.split(s);
  72. // set操作
  73. if(string.length == 2){
  74. // 如果key不在cache中,则将该(key,value)插入cache中;如果key在cache中,则重置value的值。
  75. // 1.cache未满
  76. if(map.size() == 0){
  77. m.put(string[0], string[1]);
  78. map.put(index++, m);
  79. }else if(map.size() < capacity){
  80. for(int key : map.keySet()){
  81. mapTmp = map.get(key);
  82. // 2.cache存在旧k,替换旧v
  83. if(mapTmp.containsKey(string[0])){
  84. m.put(string[0], string[1]);
  85. flag = true;
  86. break;
  87. }
  88. }
  89. if(!flag){
  90. // 3.cache不存在旧k,直接插入
  91. m.put(string[0], string[1]);
  92. }
  93. map.put(index++, m);
  94. }
  95. // 4.cache已满
  96. else{
  97. for(int key : map.keySet()){
  98. mapTmp = map.get(key);
  99. // 5.cache存在旧k,替换旧v
  100. if(mapTmp.containsKey(string[0])){
  101. m.put(string[0], string[1]);
  102. map.put(index++, m);
  103. map.remove(key);
  104. break;
  105. }
  106. else{
  107. // 6.cache不存在旧k,使用LRU将元素从cache中删除
  108. int min = Collections.min(map.keySet());
  109. int max = Collections.max(map.keySet());
  110. /* for(int i : map.keySet()){
  111. if(i < min){
  112. min = i;
  113. }
  114. if(i > max)
  115. max = i;
  116. }*/
  117. // 根据LRU规则,将元素从cache中删除
  118. map.remove(min);
  119. // 将元素存入cache中最大位置+1处
  120. m.put(string[0], string[1]);
  121. map.put(max+1, m);
  122. break;
  123. }
  124. }
  125. }
  126. }else if(string.length == 1){
  127. flag = false;
  128. // get操作
  129. for(int in : map.keySet()){
  130. mapTmp = map.get(in);
  131. if(mapTmp.containsKey(string[0])){
  132. flag = true;
  133. System.out.println(mapTmp.get(string[0]));
  134. break;
  135. }
  136. }
  137. if(!flag)
  138. System.out.println("-1");
  139. }
  140. }
  141. }
  142. } 

   其中,有关map类型m的创建位置,自己再次犯了错误。new的m为引用类型,存放在栈中。应保证m在循环体内创建,这样结果才不会出现map累加的现象。类似错误同样出现在博文《Android进阶(四)一个APP引发的思索之ArrayList的add总是添加相同的值》。

2迅雷专用链提取(正则超时)


  
  1. package cn.edu.ujn.practice;
  2. import java.util.Scanner;
  3. import java.util.regex.Matcher;
  4. import java.util.regex.Pattern;
  5. /**
  6. *
  7. * @author SHQ
  8. 迅雷专用链提取
  9. 时间限制:C/C++语言 1000MS;其他语言 3000MS
  10. 内存限制:C/C++语言 65536KB;其他语言 589824KB
  11. 题目描述:
  12. 迅雷专用链是通过迅雷专用链技术将网站现有的HTTP、FTP等下载协议转换成迅雷的专用下载协议,从而实现与web迅雷的无缝结合。常见的软件下载使用的是http或ftp下载协议,而迅雷专用链使用的是专用的"thunder://"下载协议。现给定一个网页的内容文本,需要从中找出所有的雷专用链并输出结果,重复的迅雷专用链只输出一个,在网页的内容文本字符串中的位置排前的迅雷专用链先输出。
  13. 已知迅雷专用链组成:
  14. “thunder://” + 对正常http下载链接进行处理后Base64编码的字符串
  15. (Base64编码后的字符串由数字、大小写字母、加号’+’、斜杠’/’、等号”=”组成)
  16. 如: thunder://QUFodHRwOi8vZGwueHVubGVpLmNvbS9aWg==
  17. 输入
  18. 网页内容的文本字符串,可能是多行。
  19. 输出
  20. 如果没有找到,则输出 no。
  21. 如果找到结果:
  22. 第一行输出一个整数,即找到的迅雷专用链个数n
  23. 接下的n行每行输出一个迅雷专用链,重复的迅雷专用链只输出一次,在输入字符串中的位置排前的迅雷专用链先输出。
  24. 样例输入
  25. <a href="thunder://QUFodHRwOi8vZGwueHVubGVpLmNvbS9aWg==/">This ia a thunder url</a>
  26. 样例输出
  27. thunder://QUFodHRwOi8vZGwueHVubGVpLmNvbS9aWg==
  28. Hint
  29. 题目解析:
  30. 主要分析迅雷专用链的特点,通过字符串匹配查找,或通过正则表达式查找。
  31. */
  32. public class XunLei_2 {
  33. public static void main(String[] args) {
  34. Scanner in = new Scanner(System.in);
  35. StringBuffer sb = new StringBuffer();
  36. while (in.hasNextLine()) {
  37. // 输入文本
  38. String s = in.nextLine();
  39. if(s == null || s.length() == 0)
  40. break;
  41. sb.append(s);
  42. resolution(sb.toString());
  43. // 只输出这句话就能通过17%!也是醉了~
  44. System.out.println("no");
  45. }
  46. }
  47. private static void resolution(String str){
  48. Pattern pattern = Pattern.compile("(thunder://){1}[\\w\\d//=+]+");
  49. Matcher matcher = pattern.matcher(str);
  50. StringBuffer buffer = new StringBuffer();
  51. int cnt = 0;
  52. while(matcher.find()){
  53. cnt++;
  54. buffer.append(matcher.group());
  55. buffer.append("\r\n");
  56. }
  57. System.out.println(cnt);
  58. System.out.println(buffer.toString());
  59. }
  60. }

   绝对的坑,用正则直接提示超时!

感触

    做编程题之前,首先要画出流程图,使编程逻辑更加清晰。编程完成后,要设计测试用例,分为功能性测试和特殊测试。尤其要特别注意边界值的测试。

美文美图



文章来源: shq5785.blog.csdn.net,作者:No Silver Bullet,版权归原作者所有,如需转载,请联系作者。

原文链接:shq5785.blog.csdn.net/article/details/52594646

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。