剑指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]

    public static void shellSort(int[] data) {
        int j = 0;
        int temp = 0;
        for (int increment = data.length / 2; increment > 0; increment /= 2) {
            for (int i = increment; i < data.length; i++) {
                temp = data[i];
                for (j = i; j >= increment; j -= increment) {
                    if(temp < data[j - increment]){
                        data[j] = data[j - increment];
                    }else{
                        break;
                    }
                }
                data[j] = temp;
            }
            for(int a : data)
            	System.out.print(a + " ");
            System.out.println("");
        }
    }

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

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

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

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

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

堆(Heap)

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

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

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

栈(Stack)

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

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

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

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

编程题

1.LRUCache(29%)

程序流程图(set操作)


package cn.edu.ujn.practice;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.regex.Pattern;
/**
 *
 * @author SHQ
 *
LRUCache
时间限制:C/C++语言 1000MS;其他语言 3000MS
内存限制:C/C++语言 65536KB;其他语言 589824KB
题目描述:
为LRU Cache设计一个数据结构,它支持两个操作:
1)get(key):如果key在cache中,则返回对应的value值,否则返回-1。
2)set(key,value):如果key不在cache中,则将该(key,value)插入cache中(注意,如果cache已满,则必须把最近最久未使用的元素从cache中删除);
如果key在cache中,则重置value的值。
3)key,value为int型数据。
输入
第一行为capacity(capacity>0), 后面输入的每行数据,有两种情况:
一种有key和value(key,value以空格分隔),这种情况为set数据,一种只有一个key值,这种为get数据。
输出
根据给定的capacity和多组测试数据,输出指定key值对应value值,如果该key值不存在,返回-1。
样例输入
3
100 100
200 200
300 300
100 100
400 400
100
200
300
500
样例输出
100
-1
300
-1
 */
public class XunLei_1 {

    public static void main(String[] args) {
    	StringBuffer sb =new StringBuffer();
        Scanner in = new Scanner(System.in);
        // 容量
        int capacity = in.nextInt();
        // 用于接收换行符
        in.nextLine();
        while (in.hasNextLine()) {
            String s = in.nextLine();
            if(s == null || s.length() == 0)
            	break;
            sb.append(s + "\r");
        }
        resolution(capacity, sb.toString());
    }

    private static void resolution(int capacity, String str){
/*    System.out.println(capacity);
    System.out.println(str);*/
    	int index = 0;
    	Map<Integer, HashMap<String, String>> map = new HashMap<Integer, HashMap<String, String>>();
    	Map<String, String> mapTmp;
    	Pattern pat = Pattern.compile("[ ]+");
    	Pattern pattern = Pattern.compile("[\r]");
    	String [] sr = pattern.split(str);
    	boolean flag = false;
    	for(String s : sr){
// 注意map集合m的创建位置
    	HashMap<String, String> m = new HashMap<String, String>();
    	String [] string = pat.split(s);
    	// set操作
    	if(string.length == 2){
    	// 如果key不在cache中,则将该(key,value)插入cache中;如果key在cache中,则重置value的值。
    	// 1.cache未满
    	if(map.size() == 0){
    	m.put(string[0], string[1]);
    	map.put(index++, m);
    	}else if(map.size() < capacity){
    	for(int key : map.keySet()){
    	mapTmp = map.get(key);
    	// 2.cache存在旧k,替换旧v
    	if(mapTmp.containsKey(string[0])){
    	m.put(string[0], string[1]);
    	flag = true;
    	break;
    	}
    	}
if(!flag){
// 3.cache不存在旧k,直接插入
m.put(string[0], string[1]);
}
map.put(index++, m);
    	}
    	// 4.cache已满
    	else{
    	for(int key : map.keySet()){
    	mapTmp = map.get(key);
    	// 5.cache存在旧k,替换旧v
    	if(mapTmp.containsKey(string[0])){
    	m.put(string[0], string[1]);
    	map.put(index++, m);
    	map.remove(key);
    	break;
    	}
    	else{
    	// 6.cache不存在旧k,使用LRU将元素从cache中删除
    	int min = Collections.min(map.keySet());
    	int max = Collections.max(map.keySet());
/*    for(int i : map.keySet()){
    if(i < min){
    min = i;
    }
    if(i > max)
    max = i;
    }*/
    	// 根据LRU规则,将元素从cache中删除
    	map.remove(min);
    	// 将元素存入cache中最大位置+1处
    	m.put(string[0], string[1]);
    	map.put(max+1, m);
    	break;
    	}
    	}
    	}
    	}else if(string.length == 1){
    	flag = false;
    	// get操作
    	for(int in : map.keySet()){
    	mapTmp = map.get(in);
    	if(mapTmp.containsKey(string[0])){
    	flag = true;
    	System.out.println(mapTmp.get(string[0]));
    	break;
    	}
    	}
    	if(!flag)
    	System.out.println("-1");
    	}
    	}
    }
} 

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

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

package cn.edu.ujn.practice;

import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
 *
 * @author SHQ
迅雷专用链提取
时间限制:C/C++语言 1000MS;其他语言 3000MS
内存限制:C/C++语言 65536KB;其他语言 589824KB
题目描述:
迅雷专用链是通过迅雷专用链技术将网站现有的HTTP、FTP等下载协议转换成迅雷的专用下载协议,从而实现与web迅雷的无缝结合。常见的软件下载使用的是http或ftp下载协议,而迅雷专用链使用的是专用的"thunder://"下载协议。现给定一个网页的内容文本,需要从中找出所有的雷专用链并输出结果,重复的迅雷专用链只输出一个,在网页的内容文本字符串中的位置排前的迅雷专用链先输出。
已知迅雷专用链组成:
“thunder://” + 对正常http下载链接进行处理后Base64编码的字符串
(Base64编码后的字符串由数字、大小写字母、加号’+’、斜杠’/’、等号”=”组成)
如: thunder://QUFodHRwOi8vZGwueHVubGVpLmNvbS9aWg==
输入
网页内容的文本字符串,可能是多行。
输出
如果没有找到,则输出 no。
如果找到结果:
第一行输出一个整数,即找到的迅雷专用链个数n
接下的n行每行输出一个迅雷专用链,重复的迅雷专用链只输出一次,在输入字符串中的位置排前的迅雷专用链先输出。
样例输入
<a href="thunder://QUFodHRwOi8vZGwueHVubGVpLmNvbS9aWg==/">This ia a thunder url</a>
样例输出
1
thunder://QUFodHRwOi8vZGwueHVubGVpLmNvbS9aWg==
Hint
题目解析:
主要分析迅雷专用链的特点,通过字符串匹配查找,或通过正则表达式查找。
 */
public class XunLei_2 {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        StringBuffer sb = new StringBuffer();
        while (in.hasNextLine()) {
        	// 输入文本
            String s = in.nextLine();
            if(s == null || s.length() == 0)
            	break;
            sb.append(s);
            resolution(sb.toString());
            // 只输出这句话就能通过17%!也是醉了~
            System.out.println("no");
        }
}

    private static void resolution(String str){
    	Pattern pattern = Pattern.compile("(thunder://){1}[\\w\\d//=+]+");
    	Matcher matcher = pattern.matcher(str);
    	StringBuffer buffer = new StringBuffer();
    	int cnt = 0;
    	while(matcher.find()){
    	cnt++;
    	    buffer.append(matcher.group());
    	    buffer.append("\r\n");
    	}
    	System.out.println(cnt);
    	System.out.println(buffer.toString());
    }
}

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

感触

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

美文美图

剑指Offer——迅雷笔试题+知识点总结的更多相关文章

  1. 剑指Offer——网易笔试题+知识点总结

    剑指Offer--网易笔试题+知识点总结 Fibonacci package cn.edu.ujn.nk; import java.util.ArrayList; import java.util.S ...

  2. 剑指Offer——咪咕笔试题+知识点总结

    剑指Offer--咪咕笔试题+知识点总结 情景回顾 时间:2016.10.09 15:00-16:30 地点:山东省网络环境智能计算技术重点实验室 事件:咪咕笔试 知识点总结 1.Html设置格式贵阳 ...

  3. 剑指Offer——滴滴笔试题+知识点总结

    剑指Offer--滴滴笔试题+知识点总结 情景回顾 时间:2016.9.18 15:00-17:00 地点:山东省网络环境智能计算技术重点实验室 事件:滴滴笔试   总体来说,滴滴笔试内容体量不算多, ...

  4. 《剑指offer》面试题39 二叉树的深度(java)

    摘要: 今天翻到了<剑指offer>面试题39,题目二中的解法二是在函数的参数列表中通过指针的方式进行传值,而java是没有指针的,所以函数要进行改造.然而我翻了下别人的java版本(我就 ...

  5. 【剑指Offer】面试题10- II. 青蛙跳台阶问题

    题目 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶.求该青蛙跳上一个 n 级的台阶总共有多少种跳法. 答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返 ...

  6. 《剑指offer》面试题12:打印1到最大的n位数

    面试题12:打印1到最大的n位数 剑指offer题目12,题目如下 输入数字n,按顺序打印出1到最大的n位十进制数,比如输入3,则打印出1,2,3一直到最大的三位数999 方法一 和面试题11< ...

  7. 《剑指offer》面试题11: 数值的整数次方

    面试题11: 数值的整数次方 剑指offer面试题11,题目如下 实现函数double power(double base,int exponent),求base的exponent次方, 不得使用库 ...

  8. 《剑指Offer》- 面试题3

    <剑指Offer——名企面试官精讲典型编程题>  面试题3:  二维数组元素从左到右.从上到下递增,输入一个二维数组和一个整数,  查找该整数. 自己的思路:有序条件下进行查找,当然最简单 ...

  9. 《剑指offer》面试题的Python实现

    <剑指Offer>是很多程序员面试前要看的书,但里面的算法都是基于C++实现的,最近用了三周左右时间,用Python完成了里面几乎所有的算法题,由于时间以及个人水平均有限,或许会有部分问题 ...

随机推荐

  1. Codefroces 850C Arpa and a game with Mojtaba

    Description两个人Van♂游戏.给出$n$个正整数$ai$两人轮流操作,每次选出一个素数$p$和一个幂数$k$,选择的前提为该$n$个数中有$p^{k}$的倍数.接着将所有的$p^{k}$的 ...

  2. [SHOI2017]相逢是问候

    Description 信息将你我连结.B君希望以维护一个长度为n的数组,这个数组的下标为从1到n的正整数.一共有m个操作,可以 分为两种:0 l r表示将第l个到第r个数(al,al+1,...,a ...

  3. [NOI2011]道路修建

    题目描述 在 W 星球上有 n 个国家.为了各自国家的经济发展,他们决定在各个国家 之间建设双向道路使得国家之间连通.但是每个国家的国王都很吝啬,他们只愿 意修建恰好 n – 1 条双向道路. 每条道 ...

  4. 【 lca倍增模板】

    题目描述 对于 n(<100000)个点 n-1 条掉权值的边,有 m 个询问,每条询问求两个结点之间的路径上边权的最小值 输入 第一行 n,表示结点个数,接下来 n-1 行,每行 a b w ...

  5. 例 7-10 uva12212(迭代加深搜索)

    题意:对于一段数字,每次可以剪切一段连续的自然数,粘贴到任意部分,使其变成升序 思路: 考虑的是进行搜索,深搜并不能保证是最短,广搜感觉每层的情况太多. 迭代加深:枚举搜索深度,然后进行深搜. 这种方 ...

  6. BZOJ4574 [Zjoi2016]线段树

    比较厉害的dp. 网上题解都是利用了随机的条件,用了一个$O(n^4)$的dp,这里简单说一下. 用f(x,i,l,r)表示经过前i轮操作,[l,r]的所有数<=x,且l-1和r+1都>x ...

  7. 文本分类学习 (五) 机器学习SVM的前奏-特征提取(卡方检验续集)

    前言: 上一篇比较详细的介绍了卡方检验和卡方分布.这篇我们就实际操刀,找到一些训练集,正所谓纸上得来终觉浅,绝知此事要躬行.然而我在躬行的时候,发现了卡方检验对于文本分类来说应该把公式再变形一般,那样 ...

  8. c语言的第三次作业

    (一)改错题 计算f(x)的值:输入实数x,计算并输出下列分段函数f(x)的值,输出时保留1位小数. 输入输出样例1: Enterr x: 10.0 f(10.0) = 0.1 输入输出样例2: En ...

  9. js数组求差集

    var arr1 = [2,3,5,88,99,444,66];var arr2 = [2,88,66]; arr_dive(arr1,arr2); function arr_dive(aArr,bA ...

  10. Enum枚举

    Java Enum原理 public enum Size{ SMALL, MEDIUM, LARGE, EXTRA_LARGE }; 实际上,这个声明定义的类型是一个类,它刚好有四个实例,在此尽量不要 ...