文章目录

  • 1. 排序
    • 2.1 快速排序
      • - 思想
      • - 复杂度
      • - 代码
  • 2. 日期问题
    • 2.1 数据结构
    • 2.2 判断闰年
    • 2.3 获取下一天
    • 2.4 计算间隔日期
  • 3. HashMap
    • 3.1 内部结构
    • 3.2 存取实现
    • 3.3 基本用法
    • 3.4 遍历
    • 3.5 专用名词
    • 3.6 面试问题
  • 4. 查找
    • 4.1 二分法
      • - 思想
      • - 复杂度
      • - 代码

1. 排序

2.1 快速排序

- 思想

  • 逐个元素读入
  • 为每个元素找到它应该在的位置
  • 将该位置之后的元素逐个向后移动

- 复杂度

  • n(logn)

- 代码

Scanner sc = new Scanner(System.in);
while (sc.hasNextLine()){int num = sc.nextInt();int[] elements = new int[num+1];int temp, index = 0;for (int i = 0; i < num; i++) {temp = sc.nextInt();if (i == 0) elements[i] = temp;else {//calculate indexfor (int j = 0; j < i; j++){index = i-1;while (index > -1 && temp < elements[index]){ index -= 1; }}//move elementsfor (int y = i+1; y > index+1; y--){elements[y] = elements[y-1];}elements[index+1] = temp;}}//print elementsfor (int i = 0; i < num; i++) {System.out.print(elements[i] + " ");}System.out.print('\n');
}

2. 日期问题

2.1 数据结构

import java.util.Scanner;public class MyDate {private int day;private int month;private int year;public int getDay() { return day; }public int getMonth() { return month; }public int getYear() { return year; }public MyDate(){this.day = 1;this.month = 1;this.year = 0;}public MyDate(int y, int m, int d){this.year = y;this.month = m;this.day = d;}private static int[][] dayOfMonth = {{0,0},{31,31},{28,29},{31,31},{30,30},{31,31},{30,30},{31,31},{31,31},{30,30},{31,31},{30,30},{31,31}};private static int[][][] days = new int[3001][13][32];//取绝对值public static int ABS(int x){ return (x>0)?x:-x;}
}

2.2 判断闰年

private static int ISLEAP(int year){return (year%400==0)||(year%100!=0 && year%4==0)?1:0;
}

2.3 获取下一天

private void nextDay(){this.day++;if(this.day>dayOfMonth[this.month][ISLEAP(this.year)]){this.day = 1;this.month++;if(this.month >12){this.month = 1;this.year++;}}}

2.4 计算间隔日期

public static void initDays(){MyDate d = new MyDate();int count = 0;while (d.year<3001){days[d.year][d.month][d.day] = count;count++;d.nextDay();}
}
public void calDays(){MyDate.initDays();Scanner sc = new Scanner(System.in);while (sc.hasNextLine()){MyDate[] myDates = new MyDate[2];int year = 0, month = 1, day = 1;for (int i = 0; i < 2; i++) {String str = sc.nextLine();year = Integer.parseInt(str.substring(0,4));month = Integer.parseInt(str.substring(4,6));day = Integer.parseInt(str.substring(6,8));myDates[i] = new MyDate(year, month, day);}int d1 = myDates[0].getdays(), d2 = myDates[1].getdays();int result = MyDate.ABS(d2-d1);System.out.println(result);}
}

3. HashMap

3.1 内部结构

  • 使用数组+链表结合的方式进行存储
  • 元素存储到数组的规则:
    • hash(key)%len
  • 内部有静态类 Entry
    • 属性:key, value, next
    • 数组就是 Entry[],长度必须为2的次方

![image-20190306082033206](/Users/mustafa/Library/Application Support/typora-user-images/image-20190306082033206.png)

3.2 存取实现

  • 每个key的hash是一个固定的int值

    • 根据键的hash值找到其在Entry[]数组中的下标,进行存取
    • 因此,下标相同的key,hashcode不一定相同
    int hash = key.hashCode();
    int index = hash % Entry[].length;
    Entry[index] = value; //存
    return Entry[index]; //取
    
  • 当key的哈希值对容量的余数相同时,A和B在Entry[]中有相同的index

    • 使用链表的方式连接起来,数组中存储的是最后插入的元素
    B.next = A;
    Entry[index] = B;
    
  • 插入key相同的对象时,新数据会覆盖旧数据

  • 当键值对链表的size>threshold时,哈希表会动态扩容

    void addEntry(int hash, K key, V value, int bucketIndex) {Entry<K,V> e = table[bucketIndex];table[bucketIndex] = new Entry<K,V>(hash, key, value, e); //参数e是Entry.next//如果size超过threshold,则扩充table大小,再散列if (size++ >= threshold)resize(2 * table.length);
    }
    void resize(int newCapacity) {  Entry[] newTable = new Entry[newCapacity];  transfer(newTable);  table = newTable;  threshold = (int)(newCapacity * loadFactor);
    }
    //将原来的数据转移到新数组中
    void transfer(Entry[] newTable) {  Entry[] src = table;  int newCapacity = newTable.length;  for (int j = 0; j < src.length; j++) {  Entry<K,V> e = src[j];  if (e != null) {  src[j] = null;  do {  Entry<K,V> next = e.next;  int i = indexFor(e.hash, newCapacity);  e.next = newTable[i];  newTable[i] = e;  e = next;  } while (e != null);  }  }
    }
    
  • get()时,先定位key在Entry[]中的下标,再遍历此处链表进行查找

  • null key总是存放在Entry[]的第一个元素

3.3 基本用法

//声明
HashMap<Integer, String> map = new HashMap<>();
//插入数据
map.put(1,"a");
//查询是否含有 key/value
boolean result = map.containsKey(1);
boolean r = map.containsValue("a");
//查询哈希表大小
int size = map.size();
//获取某个key对应的value
String str = map.get(1);
//获取哈希表中的 value 数组
List<String> s = (List<String>) map.values();

3.4 遍历

HashMap<Integer, Integer> resultMap = new HashMap<>();
Iterator i = resultMap.entrySet().iterator();
while (i.hasNext()){Map.Entry entry = (Map.Entry)i.next();int key = (int)entry.getKey();int val = (int)entry.getValue();
}

3.5 专用名词

编号 名称 解释
1 hashCode 根据某种映射关系(哈希函数)将key映射为一个int型的哈希值
2 Entry[] 存储内部静态对象的数组,具有一个初始容量
3 bucket 在Entry[]数组中,每个下标对应一个桶,用来存储哈希值相同的对象
4 equals 比较函数,在指定桶中寻找key符合目标值的对象
5 capacity 容量,哈希表数组的长度
6 loadFactor 负载因子,小于1的浮点数(默认0.75),当哈希表在其容量自动增加之前可以达到的一种尺度
7 threshold capacity*loadFactor,最多容纳的Entry数,元素数大于它时需要扩容
8 rehash 再哈希,当哈希表中的条目数>容量*负载因子(填满75%的bucket),将数组容量翻倍,对每个条目重新进行哈希、计算桶号进行分配

3.6 面试问题

  • HashMap的工作原理?

    • 基于hashing原理,我们通过put()和get()方法储存和获取对象。
    • 将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,让后找到bucket位置来储存值对象。当获取对象时,通过键对象的equals()方法找到正确的键值对,然后返回值对象。
    • HashMap使用LinkedList来解决碰撞问题,当发生碰撞了,对象将会储存在LinkedList的下一个节点中。
    • HashMap在每个LinkedList节点中储存键值对对象。
  • 为什么String, Interger这样的wrapper类适合作为键?
    • 因为String是不可变的,也是final的,而且已经重写了equals()和hashCode()方法了。
    • 不可变性是必要的,因为为了要计算hashCode(),就要防止键值改变,如果键值在放入时和获取时返回不同的hashcode的话,那么就不能从HashMap中找到你想要的对象。
    • 不可变性还有其他的优点如线程安全。
  • 我们可以使用自定义的对象作为键吗?
    • 可以使用任何对象作为键,只要它遵守了equals()和hashCode()方法的定义规则,并且当对象插入到Map中之后将不会再改变了。
    • 如果这个自定义对象时不可变的,那么它已经满足了作为键的条件,因为当它创建之后就已经不能改变了。

4. 查找

4.1 二分法

- 思想

  • 递归调用函数
  • 每次递归判断中间下标元素是否是目标元素
  • 如不匹配,根据大小关系向左、右递归

- 复杂度

  • logn

- 代码

public void biSearch(){int num = 5, target = 8, left = 0, right = 0, mid = 0, index = 0;right = num-1;mid = (left+right)/2;int[] arr = {1,2,4,6,8};while (right>=left){if(target==arr[mid]){System.out.println("Done, result is "+mid);break;}else if(target<arr[mid]){right = mid-1;}else {left = mid+1;}mid = (left+right)/2;}System.out.println("Not done, result is -1");}

王道论坛机试指南学习笔记(一)经典入门相关推荐

  1. 王道论坛机试指南学习笔记(五)搜索

    文章目录 1. 枚举 - 简述 - 百鸡问题 2.2 BFS - 算法 - 迷宫问题 - 可乐问题 - 解题关键 3. 递归 - 思想 - 汉诺塔 - 素数环问题 - 图遍历 4. DFS - 算法 ...

  2. 王道论坛机试指南学习笔记(二)数据结构

    文章目录 1. 栈 - 基本用法 - 括号匹配 - 四则运算器 2. 优先队列 - 基本用法 - 哈夫曼树 3. 二叉树 - 数据结构 - 前序遍历 - 中序遍历 - 后序遍历 - 根据前中序生成二叉 ...

  3. 王道论坛机试指南学习笔记(三)数学问题

    文章目录 1. 2的n次方 - 移位 - power 2. 特殊值 - 最大值 - 绝对值 3. 取整 4. 数位拆解 - 数学方法 - 代码方法 5. 进制转换 - n转10 - 10转n 6. G ...

  4. 王道论坛机试指南学习笔记(四)图论

    文章目录 1. 并查集 - 基本表示 - 集合的合并 - 查找根节点 - 查找连通分量个数 2. 最小生成树MST - 定义 - Kruskal算法 - java代码 3. 最短路径 - 定义 - F ...

  5. 考研机试准备--《王道论坛机试指南》学习笔记

    一.代码能力培养的层次结构 1.会编写(默写)经典程序的代码. 2.将自己的想法和抽象的问题转换为代码实现. 3.编写出的代码在大量的,多种多样的测试用例之前仍然具有健壮性. 二.常见概念 1.特殊判 ...

  6. 王道考研机试指南代码合集

    王道考研机试指南代码合集 github链接 王道考研机试指南的代码合集,附有一些笔记和感悟 文件夹中包括机试指南的pdf,笔记部分,和代码对应题目的列表 如发现任何问题欢迎在下面留言 更新: 最短路题 ...

  7. 王道考研机试指南第2版——题目提交链接

    王道考研机试指南第2版--题目链接 文章来自https://github.com/zguolee/WDAlgorithmsNote/blob/master/README.md 王道考研机试指南第2版- ...

  8. netty权威指南学习笔记一——NIO入门(4)AIO

    NIO2.0引入了新的异步通道的概念,并提供了异步文件通道和异步套接字通道的实现.异步通道提供以下两种方式获取操作结果. 1.通过java.util.concurrent.Future 类来表示异步操 ...

  9. 王道出版的机试指南_《王道论坛计算机考研机试指南》试读版.pdf

    <王道论坛计算机考研机试指南>试读版 王道论坛 王道论坛计算机考研机试指南 王道论坛 2013.01.06 写在前面的话 各位王道的小崽子们,今天你们考完初试了,感觉解放了吧?轻松了吧?无 ...

最新文章

  1. mysql数据库基本操作命令
  2. 全局异常捕获处理-@ControllerAdvice+@HandleException
  3. QT调用dll且进入DLL src code调试
  4. oracle 数据库_操作事项_05
  5. python 添加图例_Python | 在图例标签中添加Sigma
  6. Linux基础知识一
  7. 2008-09-01 XEIM 1.0 beta 已发布
  8. math的向上取整_JavaScript Math.ceil 方法(对数值向上取整)
  9. 桌面计算机未响应怎么办,资源管理器未响应怎么办
  10. rufus中gpt和mrb磁盘_Rufus镜像ISO系统文件写入工具,支持GPT和MBR,轻松创建USB启动盘...
  11. KeyStore(示例,出错代码)
  12. QT修改releas发布的exe图标
  13. 电容实际等效模型(容抗、感抗、品质因数Q)
  14. WM_INITDIALOG与WM_CREATE消息的区别
  15. 更改Mysql数据库密码
  16. 百度地图三种定位方式测试(高精度、低功耗、仅用设备)
  17. 计算机应用基ata,《计算机应用基》知识宝典.doc
  18. 数据库 物化视图详解
  19. java 面向对象编程之二
  20. Xmanager PowerSuite7中文绿色版下载(免注册)Xmanager7、Xshell7、Xftp7和Xlpd7

热门文章

  1. frps 多个_frp服务器server端是否支持多个frpc客户端?
  2. cena使用自定义校检器
  3. paip 一千 常用汉字 高频汉字 覆盖率90
  4. 抖音优质短视频脚本怎么写?只需三步
  5. 2020年中国毫米波雷达行业现状分析,24GHz国产化率较高「图」
  6. iOS16灵动岛横屏视频播放适配(ZFPlayer)
  7. 分享下这些软件外包公司(2023最新版),程序员有福了
  8. MT6771芯片开发资料,MT6771原理图、参考设计、移植指南
  9. flex-warp换行后 间隔调整
  10. python列表元素循环左移_python字符串循环左移