Leetcode刷题 day02 哈希表

哈希表Hash Table,也叫散列表),是根据键(key)而直接访问在内存存储位置的数据结构。也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度,这个映射函数称作哈希函数,存放记录的数组称作哈希表。

哈希表使用O(1)时间进行数据的插入删除和查找,但是哈希表不保证表中数据的有序性,这样哈希表中查找最大数据或者最小数据的时间是O(N)实现

一,变位词组。题目链接:https://leetcode-cn.com/problems/group-anagrams-lcci/

      对String类型的字符串进行排序:先将String类型的字符串转换为char类型的字符数组,再调用Arrays.sort()对数组进行排序,最后再转换为String类型的字符串。

String str = "adfgbcs";
char[] chars = str.toCharArray();
Arrays.sort(chars);
String key = new String(chars);

题解:

class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
            List<List<String>> res = new LinkedList<>();
            Map<String,Integer> map = new HashMap<>();
            int index = 0;
            for(String str:strs){
                char[] chars = str.toCharArray();
                Arrays.sort(chars);
                String str1 = new String(chars);
                if(!map.containsKey(str1)){
                    map.put(str1,index++);
                    List<String> temp = new LinkedList();
                    temp.add(str);
                    res.add(temp);
                }else{
                    res.get(map.get(str1)).add(str);
                }
            }
        return res;
    }
}

 

二,最佳直线。题目链接:https://leetcode-cn.com/problems/best-line-lcci/。

                                  这是一道数学题。。。。。。。。

   二维数组:数组中的元素是数组。

   二维数组的定义:以int类型举例  int[][] scores;//定义一个int类型的二维数组

   二维数组的初始化:1.静态初始化(直接后面大括号赋值) scores = new int[][]{ {1,2,3},           {2,3}};          2.动态初始化:int[][] i =new int[3][4];//动态初始化方式1   int[][] i =new               int[3][];//动态初始化方式二

直线的一般式方程:直线的一般式方程:Ax + By + C = 0 ;

直线的一般式方程适用于所有的二维空间直线。而其他直线方程,如点斜式,两点式,要么不能支持所有情况下的直线(比如跟坐标轴垂直或者平行),要么不能支持所有情况下的点(比如x坐标相等,或者y坐标相等)。所以一般式方程在用计算机处理二维图形数据时特别有用。

注意:1)要唯一确定一条直线,只需要知道A,B,C三个数即可。不过要对A,B,C求最大公约数。  2)对于任意两点(X1,Y1),(X2,Y2)都有A = Y2 - Y1   B = X1 - X2  C = X2Y1-X1Y2

其他知识点:最大公约数(Greatest Common Divisor)指两个或多个整数共有约数中最大的一个。也称最大公因数,最大公因子。最大公约数的求法采用辗转相除法。

int fun(int m,int n){
if(n==0) return m;
return fun(n,m%n);
}

位运算(&)效率要比代替取模运算(%)高很多,主要原因是位运算直接对内存数据进行操作,不需要转成十进制,因此处理速度非常快。

那么,为什么可以使用位运算(&)来实现取模运算(%)呢?这实现的原理如下:

X % 2^n = X & (2^n – 1)

2^n表示2的n次方,也就是说,一个数对2^n取模 == 一个数和(2^n – 1)做按位与运算 。

假设n为3,则2^3 = 8,表示成2进制就是1000。2^3 = 7 ,即0111。

此时X & (2^3 – 1) 就相当于取X的2进制的最后三位数。

从2进制角度来看,X / 8相当于 X >> 3,即把X右移3位,此时得到了X / 8的商,而被移掉的部分(后三位),则是X % 8,也就是余数。https://blog.csdn.net/xu_dongdong/article/details/80251936

 

今天,只做了两道题,两道题都没有搞好。

posted @ 2021-01-23 15:16  啵啵啵都有人在使用吗  阅读(80)  评论(0编辑  收藏  举报