笔试算法题总结

同步侠
• 阅读 2505

HashMap

hashmap的原理这里不再讲述,不知道的小伙伴可以看这篇文章。Hash与HashMap
hashmap数据结构的引入能帮助我们将O(n)的时间复杂度降低为O(1)的时间复杂度,代价是使用了O(n)的空间复杂度。这么一看好像功过参半。但是如果我们原来的时间复杂度是O(n^2),使用了hashmap后时间复杂度变为o(n),而只是空间复杂度变为O(n),那么还是很划算的。
力扣第一题,两数之和:
笔试算法题总结
如果我们用单纯的二维遍历做的话

public int[] twoSum(int[] nums, int target) {
    int n = nums.length;
    for (int i = 0; i < n; i++) {
        for (int j = i + 1; j < n; j++) {
            if (nums[i] + nums[j] == target) {
                return new int[]{i, j};
            }
        }
    }
    return new int[0];
}

笔试算法题总结
第一种方法时间高原因是,对于每一个第一层遍历的i,我们都需要再次遍历数组找到target - i。
如果我们用hashmap将数组元素值及对应下标存入hashmap里,我们就可以直接获得target - i对应下标值,而不需要第二次遍历。

public int[] twoSum(int[] nums, int target) {
    Map<Integer, Integer> hashtable = new HashMap<Integer, Integer>();
    for (int i = 0; i < nums.length; i++) {
        if (hashtable.containsKey(target - nums[i])) {
            return new int[]{hashtable.get(target - nums[i]), i};
        }
        hashtable.put(nums[i], i);
    }
    return new int[0];
}

笔试算法题总结
笔试算法题总结
遇到的实际题目是三数之和,给一个数组和一个目标值,在这个数组中找到三个数相加为目标值,如果找得到返回true,如果找不到返回false。三数之和就可以使用hashmap将三层循环降为两层循环,其他跟两数之和相似。

动态规划

基本思想:将待求解的问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。
某音公司笔试题,力扣原题改编
笔试算法题总结
思路是依次确定是否能到达第i个位置。到达第i个位置的要求是能到达第j个位置(i>j)并能从第j个位置直接跳跃至第i个位置。

public boolean canJump(int[] nums) {
    // 边界判断
    if (nums.length == 1) {
        return true;
    }
    boolean[] dp = new boolean[nums.length];
    int i;
    // 从第1个下标可以直接到达的地方标记为可到达。
    for (i = 0; i < nums[0] + 1 && i < nums.length; i++) {
        dp[i] = true;
    }

    // 其余标记为不可达
    for (; i < nums.length; i++) {
        dp[i] = false;
    }

    // 对于每一个位置i,确定是否能能到达第j个位置(i>j)并能从第j个位置直接跳跃至第i个位置
    for (i = nums[0] + 1; i < nums.length; i++) {
        for (int j = 0; j < i; j++) {
            if (dp[j] && j + nums[j] >= i) {
                dp[i] = true;
                break;
            }
        }
    }

    return dp[nums.length -1];
}

笔试算法题总结
笔试算法题总结
当然这只是一种思路,这题还有更快更好的方法。
力扣139题:单词拆分
笔试算法题总结
遇上题相同思路,不过在判断一个单词是否在数组中时使用hashmap判断即可。
这题也可以使用字典树来实现,有兴趣的小伙伴可以搜索什么是字典树。

贪心算法

基本思想:贪心算法并不从整体最优上加以考虑,它所做的选择只是在某种意义上的局部最优解。
某公司面试题,力扣原题改编:
笔试算法题总结
看起来很简单,但是思考起来没想到最优解。因为买入的天数一定小于卖出的天数,那么买入天数的价格一定是卖出天数到第一天里所有价格的最小值。解题思想是依次假设第i天是卖出那天,找第i天的之前最小价格那天价格,维护最大利润。

public int maxProfit(int[] prices) {
    if (prices.length <= 1)
        return 0;
    int min = prices[0], profit = 0;
    for (int i = 0; i < prices.length; i++) {
        min = Math.min(min, prices[i]);
        profit = Math.max(profit, prices[i] - min);
    }
    return profit;
}

其他

某音笔试有一道核心是判断否是双端队列的问题,就是一个队列只能从两端进。一次放入n个数,给一个数组判断是否是双端队列。
6 3 1 2 4 5 7 8
笔试过程中想复杂了,后边看到其实就是找到最小数,然后判断最小数到头尾是否是递增序列。其实在学数据结构的时候做过类似的选择题,但是不需要代码实现。对于平常的思想落实到代码实现很重要。

应试技巧

在网上看见说算法题通过率*本题分数为最后得分。对于一些输出True或False的题不会做可以直接输出结果,或者输出最小次数的题也可以直接输出3或4或5。

点赞
收藏
评论区
推荐文章
Stella981 Stella981
4年前
Python数据结构与算法——散列(Hash)
!(https://oscimg.oschina.net/oscnet/19a7428dd9c64d149aa474d3aabe80ce.png)点击上方“蓝字”关注我们散列(Hash)对于一组数据项,顺序查找的时间复杂度是O(n),二分查找是O(logn),而对于散列的数据结构,
Stella981 Stella981
4年前
Leetcode Index
序:  用于记录刷题过程中难度较大或思路怪异的题目,对于常规难度一般的题就不写入我的博客了,关于效率仅是提交时击败的百分比,可能会随时间波动,仅供参考,算法优劣以时间复杂度和空间复杂度为基准。欢迎留言讨论。题目序号难度效率Leetcode42.TrappingRainWater(https://www.oschina.
Stella981 Stella981
4年前
Redis哈希对象的ziplist编码实现了O(1)复杂度吗
问题:Redis中哈希对象有两种编码方式,分别是ziplist、hashtable方式。哈希对象,总得体现哈希算法,使得基本操作达到O(1)的效率。hashtable编码方式使用字典,也即是Java中hashMap的方式,这个我可以理解。但是,ziplist方式所有元素都是紧挨的,它是怎么实现hash,并使得查询等操作有O(1)的时间效率的呢?让我们
Wesley13 Wesley13
4年前
BFPRT线性查找算法
介绍:BFPRT算法解决的问题十分经典,即从某n个元素的序列中选出第k大(第k小)的元素,通过巧妙的分析,BFPRT可以保证在最坏情况下仍为线性时间复杂度。该算法的思想与快速排序思想相似,当然,为使得算法在最坏情况下,依然能达到o(n)的时间复杂度,五位算法作者做了精妙的处理。时间复杂度O(N)算法步骤
时间复杂度为 O(nlogn) 的排序算法 | 京东物流技术团队
归并排序归并排序遵循分治的思想:将原问题分解为几个规模较小但类似于原问题的子问题,递归地求解这些子问题,然后合并这些子问题的解来建立原问题的解,归并排序的步骤如下:划分:分解待排序的n个元素的序列成各具n/2个元素的两个子序列,将长数组的排序问题转换为短数
时间复杂度为 O (n^2) 的排序算法 | 京东物流技术团队
对于小规模数据,我们可以选用时间复杂度为O(n2)的排序算法。因为时间复杂度并不代表实际代码的执行时间,它省去了低阶、系数和常数,仅代表的增长趋势,所以在小规模数据情况下,O(n2)的排序算法可能会比O(nlogn)的排序算法执行效率高。不过随着数据规模增
时间复杂度为 O(n^2) 的排序算法
作者:京东保险王奕龙对于小规模数据,我们可以选用时间复杂度为O(n2)的排序算法。因为时间复杂度并不代表实际代码的执行时间,它省去了低阶、系数和常数,仅代表的增长趋势,所以在小规模数据情况下,O(n2)的排序算法可能会比O(nlogn)的排序算法执行效率高
贾蔷 贾蔷
8个月前
牛客12576题全解析:动态规划+质因数分解解决跳跃问题
一、题目解读牛客12576题是一道经典的算法题,要求给定起点N和终点M,求解从N到M的最少跳跃次数。题目考察的核心在于路径优化与动态规划思想,需结合数论中的质因数分解技巧,通过合理设计算法降低时间复杂度,避免暴力枚举的指数级耗时。二、解题思路采用“动态规划
菜园前端 菜园前端
2年前
什么是时间复杂度?
原文链接:什么是时间复杂度?定性描述该算法的运行时间,一个函数、用大O表示,例如O(1)、O(n)、O(logN)...常见的时间复杂度量级常数阶O(1)对数阶O(logN)线性阶O(n)线性对数阶O(nlogN)平方阶O(n²)立方阶O(n)K次方阶O(
菜园前端 菜园前端
2年前
什么是空间复杂度?
原文链接:什么是空间复杂度?算法在运行过程中临时占用存储空间大小的度量,和时间复杂度表示一样,一个函数,用大O表示,例如O(1)、O(n)、O(^2)...基础案例O(1)这段代码因为只声明了单个变量,单个变量所占用的内存永远是1。javascriptle
菜园前端 菜园前端
2年前
什么是顺序搜索?
原文链接:什么是顺序搜索?顺序搜索是一种比较低效的搜索算法,但是实现起来相对简单。主要步骤如下:1.遍历数组2.找到跟目标值相等的元素,就返回它的下标3.遍历结束后,如果没有搜索到目标值,则返回1基础案例时间复杂度:O(n)空间复杂度:O(1)javasc
同步侠
同步侠
Lv1
流浪的月亮和繁密的星辰姗姗来迟。
文章
2
粉丝
0
获赞
0