作业帮一面总结(手撕单例和动态规划)


今天下午四点做了作业帮的第一轮面试。总计时长一小时二十五分钟。

回答问题

  1. 首先是简单的自我介绍。

  2. 然后问我对C++了解多少,掌握程度(了解,可以使用和修改代码,但是对于原理或者是STL库等涉及不多。)

  3. 问我简历上没咋写其他的技能掌握情况,问我是否有其他技能(这我就蒙了,说了个OpenCV,图像处理,啥的)

  4. 问我Linux用没用过,让我讲一下Linux的内核(抱歉,不会)

  5. 问我Java中访问类型的权限,public和private以及privated的访问权限(public修饰的方法都可以访问,private修饰的方法只有本类可以访问,privated修饰的方法本包中都可以访问,这个一开始后两个答反了,面试官提醒了一下才改过来)

  6. Static的作用

  7. 问我hashmap解决冲突的方法(我讲了开放地址法,讲了扰动函数,讲了链式解决冲突)

  8. 问我数组和链表的优缺点(基础的就不说了)

  9. 然后问我如何修改,使得链表也可以大概的具有O(1)的查找时间复杂度(我先是说了HashMap,面试官说要保证有序性,HashMap不能保证有序性,我想了一会儿想不到这里有啥解决办法,我问可以用ArrayList么,因为这里面底层也是用连续内存,是基于数组实现的,且继承了List接口,面试官可能期待听到的不是这个,愣了一下,然后说明白我的意思,然后问让我说一下它底层是咋实现的,我说只知道是用数组存储,内存连续,支持O(1)的查找时间,但是增删改查是怎么实现连续的不是很清楚。然后就过了)

  10. 问我排序都熟悉吧,让我说一下快排或者是堆排序的算法原理(我讲了快排的实现方法,就讲了这篇博客的实现方法,包括使用递归,选标记位,然后前后两个指针,两个循环找比标记位大(从前找)的数和比标记位小(从后找)的数,交换等,这里没有让我代码实现,还有点小遗憾)

  11. 然后问我设计模式,我说了消费者生产者(hanlder机制),观察者模式(广播接收器),本来以为面试官会点点头,结合后面的问题来看,面试官不是做Android方向的,应该对Android的东西不是很熟。然后说了工厂模式和单例模式,让我详细讲一下工厂,这里又死了,继上次的VIVO之后第二次栽在是上面。然后让我讲一下单例模式,我说成了线程间的同步。。。我说,我有点说不清楚,可以直接实现么,他说可以,然后手撕了一个懒汉模式,然后让我改成线程安全的,我改成了双重校验锁的模式。
    在这里插入图片描述

  12. 然后说了下我的项目,然后问我项目中的算法的实现问题。

  13. 然后还有些问题记不起来了,不过大都是Java基础,没咋涉及到Android的知识。

然后说那来做个题吧,然后让我从两道题目中选一个做一下。第三题看完之后发现是01背包问题,前两天刚刚实现过,就决定写这个,第二题连看也没看。

手撕代码

草药

小A的最大梦想是成为世界上最伟大的药师,为此他想拜附近最有威望的药师为师。药师为了判断他的资质,给他出了一个难题,把他带到一个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株草药也有它自身的价值。我会给你一段时间,在这段时间里,你可以采到一些草药。如果你是一个聪明的孩子,你应该可以让采到的草药的总价值最大。”你能帮小A完成这个任务吗?

输入描述
输入数据有多组,每组数据的第一行有两个整数T(1 <= T <= 1000)和M(1 <= M <= 10),用一个空格隔开。T代表总共能够用来采药的时间,M代表山洞里的草药的数目。接下来的M行中,每行包括两个在1到100之间(包括1和100)的整数,分别表示采摘某株草药的时间和这株草药的价值。

输出描述
对每组输入数据,输出单独的一行结果。结果只包含一个整数,表示在规定的时间内,可以采到的草药的最大总价值。

样例输入
70 3
71 100
69 1
1 2

样例输出
3

题目分析

典型的01背包问题,找出状态转移方程,使用二维数组存储状态,遍历完后输出dp[m][n]即可。具体解析可以参考这两篇博客。大疆19年校招0806笔试B卷第一题(背包问题) 以及 01背包问题——贪心+DP

因为刚写过大疆的题,我就直接用的这个题的思路写的,但是中间因为手误出了些错误,因为是网页上直接写的,有些拼写错误没有提示,运行才显露出来,然后在二重循环中第二个循环的 j++ 一开始写成了 i++ ,提交运行不过找错误发现了这个巨大的失误,然后只能过10%,找了一会儿发现没有问题。和面试官申请贴到本地编译器进行debug。然后发现原来是输入有问题,它是由多组用例输入的,一开始没有发现。用while判断hasNext之后就AC了

在动态规划上,我加了一个alltime和allvalue,要是背包够大的话,都装进去就行了,也就不用进行下面的选择了。

代码实现

import java.io.*;
import java.util.*;

/*
 * To execute Java, please define "static void main" on a class
 *
 * If you define many classes, but you must have a class named Main and a public property.
 * The Main class should be the only public class.
 * The Main class must contain a static method (function) named "main" 
 * Do not add any package, like "package main"
 *
 * The TestCase is shown below
 * Input : 1 2
 * Output : 3
 */
class Main {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
        while(in.hasNext()){
            int T = in.nextInt();
        int M = in.nextInt();
        int alltime = 0;
        int allvalue = 0;
        int value[] = new int [M+1];
        int time [] = new int [M+1];
        for(int i = 1; i <= M;i++){
            time[i] = in.nextInt();
            value[i] = in.nextInt();
            alltime += time[i];
            allvalue += value[i];
        }
        if(alltime <= T)
            System.out.println(allvalue);
        else{
            int dp[][] = new int [M + 1][T + 1];
            for(int i = 0;i <= M ;i++)
                dp[i][0] = 0;
            for(int i = 0;i <= T ;i++)
                dp[0][i] = 0;
            //f(i.j) = max (f(i-1,j),f(i - 1 , j-time[i])+value[i]);
            for(int i = 1; i <= M ;i++){
                for(int j = 1; j <= T;j++){
                    if(j < time[i])
                        dp[i][j] = dp[i-1][j];
                    else
                        dp[i][j] = Math.max(dp[i-1][j],dp[i-1][j - time[i]] + value[i]);
                }
            }
            System.out.println(dp[M][T]);
        }
        }
        
        
	}
}

在这里插入图片描述然后和面试官讲了下题目的思路,这个题目AC之后大概就过了80分钟了,面试官说时间差不多了问我有没有啥想问的,我就问了问我感觉现在我需要补充的知识和需要注意的事项(也是基础,基础还要加强,再就是网络协议啥的,也要会,不过这个没有问我。)

第一轮面试结束!


结束后发现面试官给的另一个题也会是一个经典题目:(使用回溯法,我用递归暴力写过,但是8皇后还能挺快跑出来,棋盘格数再多会非常的慢,我尝试过一次跑15皇后,跑了好久好久好久才,跑16 就崩了,好像是栈溢出了 -_-!!),网上有不少解决办法,可以自行查找。

八皇后问题

会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题。

对于某个满足要求的8皇后的摆放方法,定义一个皇后串a与之对应,即a=b1b2…b8,其中bi为相应摆法中第i行皇后所处的列数。已经知道8皇后问题一共有92组解(即92个不同的皇后串)。

给出一个数b,要求输出第b个串。串的比较是这样的:皇后串x置于皇后串y之前,当且仅当将x视为整数时比y小。

输入描述
第1行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个正整数b(1 <= b <= 92)

输出描述
输出有n行,每行输出对应一个输入。输出应是一个正整数,是对应于b的皇后串。

样例输入
2
1
92

样例输出
15863724
84136275
发布了218 篇原创文章 · 获赞 636 · 访问量 45万+

猜你喜欢

转载自blog.csdn.net/qunqunstyle99/article/details/98884027