剑指Offer——顺丰笔试题+知识点总结

情景回顾

  • 时间:2016.10.16 19:00-20:40
  • 地点:山东省网络环境智能计算技术重点实验室
  • 事件:顺丰笔试

知识点总结

快排

霍尔排序(快排)

  快速排序是由安东尼·霍尔所发明的一种排序算法,又名霍尔排序。

哈夫曼树带权路径长度

  赫夫曼树又称最优二叉树,是带权路径长度WPL最小的二叉树。

  • WPL定义:树中所有叶子节点的带权路径长度之和。

  构建赫夫曼树的步骤:

  • 1.构造森林全是根;
  • 2.选用两小造新树;
  • 3.删除两小添新人;
  • 4.重复(2)(3)剩单根。

vector,map,set用什么数据结构存储

  • 1.TreeSet采用红黑树的数据结构来存储集合元素;
  • 2.EnumSet在内部以位向量的形式存储,这种存储形式非常紧凑、高效,因此Enum对象占用内存很小,运行效率很高;
  • 3.HashSet、TreeSet、EnumSet都不是线程安全的。可用Collections工具类的synchronizedSortedSet方法封装;
  • 4.ArrayList和Vector类都是基于数组实现的List类,两者均封装了一个动态、允许再分配的Object[]数组;Vector是线程安全的,而ArrayList不是。
  • 5.LinkedList与ArrayList、ArrayDeque的实现机制完全不同,ArrayList、ArrayDeque内部以数组的形式来保存集合中的元素,因此随机访问集合元素时有较好的性能;而LinkedList内部以链表的形式来保存集合中的元素,因此随即访问集合元素时性能较差,但在删除、添加元素时性能非常出色(只需改变指针所指的地址即可)。需要指出的是,虽然Vector也是以数组的形式在存储集合元素的,但因为实现了线程同步功能,所以各方面性能都有所下降。
  • 6.对于所有的内部基于数组的集合实现,例如ArrayList、ArrayDeque等,使用随机访问的性能比使用Iterator迭代访问的性能要好,因为随机访问会被映射成对数组元素的访问(因为数组以一块连续内存区来保存所有的数组元素);
  • 7.Map采用关联数组形式存储;
  • 8.HashMap和HashTable都是Map接口的典型实现类。HashTable线程安全,HashMap不安全;HashTable不允许null作为key和value,否则会报NullPointerException异常,HashMap可以使用null作为key或value。
  • 9.Properties类是HashTable类的子类,在处理属性文件时特别方便。

码上示例

package cn.edu.ujn.demo;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Properties;
/**
 *
 *
 * @author SHQ
 * @since 2016/10/16
 */
public class PropertiesDemo {
    /**
     * @param args
     */
    public static void main(String[] args) {

        final String ADDR = "C:\\Users\\SHQ\\Desktop\\temp.xml";
        // 书写properties文件
        Properties properties = new Properties();
        // 建议使用
        properties.setProperty("ONE", "1");
        properties.put("TWO", "2");
        properties.put("中文", "看看中文怎么样");
        properties.put("日本語", "日本語はどう?");
        properties.put("한국어", "한국어");
        properties.put("Thảo luận tiếng Việt", "Thảo luận tiếng Việt");

        OutputStream stream = null;
        try {
            stream = new FileOutputStream(ADDR);
            properties.storeToXML(stream, "Temporary Properties");
        }
        catch (IOException ex) {
            ex.printStackTrace();
        }finally{
            try{
                stream.close();
            }catch(Exception e){

            }
        }
        // 读取properties文件
        Properties properties2 = new Properties();
        InputStream is = null ;
        try{
            is = new FileInputStream(ADDR);
            properties2.loadFromXML(is);
            System.out.println(properties2);
        }catch (IOException e) {
            e.printStackTrace();
        }finally{
            try{
                is.close();
            }catch (Exception e) {
            }
        }

    }
}



树是一种线性表存储结构吗?

  数据结构按逻辑结构可以分为集合、线性结构、非线性结构;按存储结构可以划分为顺序、链式、索引、散列存储结构。

  简单地说,线性结构是一个数据元素的有序(次序)集合。它有四个基本特征:

  • 1.集合中必存在唯一的一个”第一个元素”;
  • 2.集合中必存在唯一的一个”最后的元素”;
  • 3.除最后元素之外,其它数据元素均有唯一的”后继”;
  • 4.除第一元素之外,其它数据元素均有唯一的”前扑”。

  • 数据结构中线性结构指的是数据元素之间存在着“一对一”的线性关系的数据结构。所以树不是线性表存储结构。

Hashtable实现栈的操作

编程题

/**
 *
 * @author SHQ
 *编程题 | 30分 1/2
 *题目描述:
    小A是一个城市中救援机构的负责人,他手头上有一张特殊的地图,记载了本省各个城市中救援队伍的数量和城市之间的道路连接情况。
    他的任务相当重要,除负责本市紧急情况救援外,他还需要在某个其他城市发生紧急情况时,第一时间带领他的队伍参与救援,
    同时调动路过城市的救援机构参与救援。
输入
    多组输入数据,第一行是一个正整数T(T<=10),表示测试数据的组数,接下来包含T组测试数据。
    每组测试数据的第一行包含四个整数n(1<n<=1000),m(0<=m<=n*(n-1)/2),s 和 t(1<=s<=n, 1<=t<=n),分别表示城市的数量、道路的数量、
    小A所在的城市和目标城市。
    第二行包含n个整数,表示每个城市中救援机构的数量。
    接下来的M行中,每行包含三个整数u, v, w, (0 <= u <= n-1, 0 <= v <= n-1, u不等于v, 0 <= w <= 1)
    表示结点u和结点v之间存在一条长度为w(1<=w<=10000的道路(保证没有重复)。
    不保证城市之间有道路可以通行。
输出
    对于每一组测试数据,输出一行"Case t: x y",其中 t表示第t组数据,t从1开始递增。x从小A所在城市到救援城市之间可以通行的路径数
    ,y为所能召集的最大救援队伍数。若无法达到救援目标城市,则输出"No answer",详见给定样例。

样例输入
    2
    4 5 0 3
    1 1 1 1
    0 1 1
    0 2 3
    1 2 2
    1 3 3
    2 3 1
    5 4 0 4
    1 1 1 1 1
    0 1 1
    1 2 3
    0 2 2
    3 4 3
样例输出
    Case 1: 3 4
    Case 2: No answer
 *
 */
/**
 * 编程题 | 30分 2/2
    分割游戏
    时间限制:C/C++语言 1000MS;其他语言 3000MS
    内存限制:C/C++语言 65536KB;其他语言 589824KB
    题目描述:
    小C负责设计一种新的益智数字游戏。游戏分A、B两方,规则如下:
    1.A方在一个纸片上写一个不超过6位的数值N,同时给出一个目标数M;
    2.B方对写有数值N的纸片进行分割,分割成的每个纸片上有一个数,所有纸片上数的和不能大于目标数M,但需要尽可能与M接近。
    3.若N与M相同,则不进行分割。
    4.若无论如何分割,所得的碎纸片上数之和都大于目标数M,则表示错误。
    5.若有多种不同的分割方式可以得到相同的最优结果。则拒绝分割。
    游戏开发之前,小A计划先编写一个模拟程序。给定两个数,第一个是目标数M,第二个是写在纸片上的数N,输出分割的方式。
    输入
    输入包括多组数据,每一组数据为一行,包括两个正整数M和N,保证两个数都不会以0开头,而且两个数最多只包含6个数字。
    输入的最后一行包括由空格分隔两个0,表示输入的结束。
    输出
    对每组输入数据,给出相应的输出。可能有三种不同的输出结果:
    sum part1 part2 ...
    rejected
    error
    上述结果表示如下:
    sum为碎纸片上数之和,即:sum = part1 + part2 +...。partj为碎纸片上数,顺序与待碎纸片上原始数中数字出现的次序一致。
    若无论如何分割,所得碎纸片上数的和都大于目标数,则输出“error”。
    若有多种不同的分割方式可得到相同的最优结果,则输出“rejected”。

    样例输入
    50 12346
    376 144139
    927438 927438
    18 3312
    9 3142
    25 1299
    111 33333
    103 862150
    6 1104
    0 0
    样例输出
    43 1 2 34 6
    283 144 139
    927438 927438
    18 3 3 12
    error
    21 1 2 9 9
    rejected
    103 86 2 15 0
    rejected
 */
package cn.edu.ujn.practice;

import java.util.Scanner;
public class SF_2 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (true) {
            String[] strs = sc.nextLine().split(" ");
            int m = Integer.valueOf(strs[0]);
            String n = strs[1];
            if (m == 0)
                break;

            int optionSum = Integer.MAX_VALUE;
            int optionSplit = Integer.MAX_VALUE;
            int sameCount = 0;
            int z = 1 << (n.length() - 1);
            for (int i=0; i<z; i++) {
                char[] chars = Integer.toBinaryString(i).toCharArray();
                int sum = 0;
                int lastIndex = 0;
                for (int j=0; j<chars.length; j++) {
                    if (chars[j] == '0')
                        continue;
                    int curIndex = n.length() - (chars.length - j);
                    sum += Integer.valueOf(n.substring(lastIndex, curIndex));
                    lastIndex = curIndex;
                }
                sum += Integer.valueOf(n.substring(lastIndex, n.length()));
                if (sum <= m && sum == optionSum) {
                    sameCount++;
                } else if (sum <= m && Math.abs(sum-m) < Math.abs(optionSum-m)) {
                    optionSum = sum;
                    optionSplit = i;
                    sameCount = 1;
                }
            }

            if (optionSum > m)
                System.out.println("error");
            else if (sameCount > 1)
                System.out.println("rejected");
            else {
                System.out.print(optionSum + " ");
                int lastIndex = 0;
                char[] chars = Integer.toBinaryString(optionSplit).toCharArray();
                for (int j=0; j<chars.length; j++) {
                    if (chars[j] == '0')
                        continue;
                    int curIndex = n.length() - (chars.length - j);
                    System.out.print(n.substring(lastIndex, curIndex) + " ");
                    lastIndex = curIndex;
                }
                System.out.println(n.substring(lastIndex, n.length()));
            }
        }
    }
}

注 数据精度

package cn.edu.ujn.practice;

public class YouKuTuDou {

    /**
     * @param args
     */
    public static void main(String[] args) {
        System.out.println(resolution(10));
    }

    private static int resolution(int k){
        int fm = 1;
        double sum = 0;
        while(sum <= k){
            // 注意不要丢失精度
            sum += 1/(double)fm;
            fm++;
        }
        return fm-1;
    }

}




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

  1. 剑指Offer——乐视笔试题+知识点总结

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

  2. 剑指Offer——携程笔试题+知识点总结

    剑指Offer--携程笔试题+知识点总结 情景回顾 时间:2016.9.17 19:10-21:10 地点:山东省网络环境智能计算技术重点实验室 事件:携程笔试 总体来说,携程笔试内容与其它企业笔试题 ...

  3. 剑指Offer——京东校招笔试题+知识点总结

    剑指Offer--京东校招笔试题+知识点总结 笔试感言 经过一系列的笔试,发觉自己的基础知识还是比较薄弱的,尤其是数据结构和网络,还有操作系统.工作量还是很大的.做到精确制导的好方法就是在网上刷题,包 ...

  4. 剑指Offer——CVTE校招笔试题+知识点总结(Java岗)

    剑指Offer(Java岗)--CVTE校招笔试题+知识点总结 2016.9.3 19:00参加CVTE笔试,笔试内容如下: 需要掌握的知识:Linux基本命令.网络协议.数据库.数据结构. 选择题 ...

  5. 剑指Offer——京东实习笔试题汇总

    剑指Offer--京东实习笔试题汇总 编程题1 题目的详细信息已经记不住,只能大致描述一下,就是求最有价值的的委托信息. n.s.B.S其中n代表委托信息,s要求的最有价值的委托信息的个数,B代表买入 ...

  6. 剑指Offer——联通研究院笔、面试题 (Offer已收割)

    剑指Offer--联通研究院笔.面试题 1.二叉树适宜存储什么样的数据? 树最适合用来表示( C ). A.有序数据元素 B.无序数据元素 C.元素之间具有分支层次关系的数据 D.元素之间无联系的数据 ...

  7. 剑指Offer——好未来视频面知识点储备+面后总结

    剑指Offer--好未来视频面知识点储备+面后总结 情景介绍 时间:2016.10.12 13:00- 地点:宿舍 事件:好未来视频面 知识点储备 数据结构 单链表反转 public class Li ...

  8. 《剑指Offer》各面试题总结

    目录 前言 面试题4 二维数组的查找 面试题5:替换空格 面试题6:从尾到头打印链表 面试题7:重建二叉树 面试题8:二叉树的下一个节点 面试题9:用两个栈实现队列 面试题10:斐波那契数列 面试题1 ...

  9. 剑指 offer代码解析——面试题39推断平衡二叉树

    题目:输入一颗二叉树的根结点.推断该树是不是平衡二叉树. 假设某二叉树中随意结点的左右子树的高度相差不超过1,那么它就是一棵平衡二叉树. 分析:所谓平衡二叉树就是要确保每一个结点的左子树与右子树的高度 ...

随机推荐

  1. C语言中关于运算符优先级别

    在一一个表达式中可能有多个不同的运算符结合起来,由于运算符的优先级别不一样,可能会形成得到的结果不同. 优先级从上到下依次递减,最上面具有最高的优先级,逗号操作符具有最低的优先级. 对于相同的优先级, ...

  2. python 随笔

    python 学习笔记 运算符重载 PYTHON-进阶-魔术方法小结(方法运算符重载) python有着像C++相似的运算符重载,只需要在类中重写__add__.sub 等方法,就可以直接对对象进行 ...

  3. Android Studio安装、配置、第一个程序的那些坑

    最近在上Android课,老师布置了量大题难的作业,然而出师未捷身先死,还没看题目,就被Android Studio的安装和环境配置搞得要死要死的,网上的教程也多也杂,良莠不齐,在经历了5小时通过的搜 ...

  4. 实验吧_登陆一下好吗(骚注入)&你真的会PHP吗?(代码审计)

    登陆一下好吗 首先看到两个输入框,分别对应账号密码,随手输个admin,admin进去,提交后发现有回显,既然题目说了过滤了一切,那就先看看过滤了些啥 经过一波测试,发现服务器过滤了union,sel ...

  5. [POI2006]OKR-Periods of Words

    题目描述 一个串是有限个小写字符的序列,特别的,一个空序列也可以是一个串. 一个串P是串A的前缀, 当且仅当存在串B, 使得 A = PB. 如果 P A 并且 P 不是一个空串,那么我们说 P 是A ...

  6. [HNOI2006]超级英雄

    题目描述 现在电视台有一种节目叫做超级英雄,大概的流程就是每位选手到台上回答主持人的几个问题,然后根据回答问题的多少获得不同数目的奖品或奖金.主持人问题准备了若干道题目,只有当选手正确回答一道题后,才 ...

  7. [bzoj4881][Lydsy2017年5月月赛]线段游戏

    来自FallDream的博客,未经允许,请勿转载,谢谢. quailty和tangjz正在玩一个关于线段的游戏.在平面上有n条线段,编号依次为1到n.其中第i条线段的两端点坐标分别为(0,i)和(1, ...

  8. Python 线程池,进程池,协程,和其他

    本节内容 线程池 进程池 协程 try异常处理 IO多路复用 线程的继承调用 1.线程池 线程池帮助你来管理线程,不再需要每个任务都创建一个线程进行处理任务. 任务需要执行时,会从线程池申请线程,有则 ...

  9. 什么是spool系统,什么是预输入,什么是缓输出?

    操作系统提供外部设备联机同时操作的功能设备spool系统,又称为假脱机系统. spool系统在应用程序执行前将应用程序的信息通过独占设备预先输入到辅存上的一个特定的存储区域存放好.称为预输入. 在应用 ...

  10. Spring学习笔记3——使用注解的方式完成注入对象中的效果

    第一步:修改applicationContext.xml 添加<context:annotation-config/>表示告诉Spring要用注解的方式进行配置 <?xml vers ...