美团笔试有点难
发布于 2018-09-06 20:33 10337 次浏览 0 赞 来自 我要提问  

我应聘的前端,题目中有c语言,当时一看就有点绝望。这还好。最后的编程题,明明写对了,可就是不给通过

67 条回复

表示一个都不会

2018-09-06 21:00
5

C语言 c++ java都考了,我的天

2018-09-06 21:09
4

JS表示第一道本地测试完全没问题,怎么还是跑36%?难不成不支持ES6?

第二题又是动态规划,好气呀,用递归做了一半不想做了。

2018-09-06 21:11
5

太难了,提前交卷了

2018-09-06 21:15
1

第一题跑过了没啥问题

第二题跑了91% 算了所有可能的分数 太傻了......


可能大家的题不太一样吧 我的第一题是m和n组队编程的问题 第二题是小明做题求最高分的问题


题目1:

let m = 0

let n = 0

rl.on('line',function(line){

let valArr = line.split(' ')

m = parseInt(valArr[0])

n = parseInt(valArr[1])

getResult()

})

function getResult() {

if (m>n) {

if (Math.floor((m+n)/3) > n) {

console.log(n)

} else {

console.log(Math.floor((m+n)/3))

}

} else {

if (Math.floor((m+n)/3) > m) {

console.log(m)

} else {

console.log(Math.floor((m+n)/3))

}

}


题目2:

let lineCount = 0

let n = 0

let inputArr = []

rl.on('line',function(line){

if (lineCount === 0) {

n = parseInt(line)

lineCount++

} else {

let valArr = line.split(' ')

valArr = valArr.map(val => parseInt(val))

inputArr.push(valArr)

if (lineCount === n) getResult()

lineCount++

}

})

function getResult() {

let max = 0

let add = function (index,score,time) {

if (index === n) return

add(index+1,score+0,time+0)

let newTime = time+inputArr[index][0]

let newScore = score+inputArr[index][1]

if (newTime <= 120) {

if (newScore > max) max = newScore

if (newTime < 120) add(index+1,newScore,newTime)

}

newTime = time+inputArr[index][2]

newScore = score+inputArr[index][3]

if (newTime <= 120) {

if (newScore > max) max = newScore

if (newTime < 120) add(index+1,newScore,newTime)

}

}

add(0,0,0)

console.log(max)

}


献丑了,第二题只通过了91%,有更好的算法的大神指点一下啊

2018-09-06 21:15
7

对逻辑选择题的那些规律题,什么给一个图文下一个图长啥样,我也是很方

2018-09-06 21:17
1

第二题没做

2018-09-06 21:19
coder_FVVMNGP5 回复 coder_zajgM09t

求第一题答案和第二题答案

2018-09-06 21:20
coder_wbZcVqw7 回复 coder_zajgM09t

第二个题,到底怎么做啊,一个小时都想不出来怎么搞

2018-09-06 21:20

第一题没学过。。。很尴尬

2018-09-06 21:20
coder_CT3AP2DX 回复 coder_zajgM09t

大佬 分享一下

2018-09-06 21:21

窒息了

2018-09-06 21:21
coder_wbZcVqw7 回复 coder_QJYlWB02

一个小时的时间都没想出来怎么做,看来又是动态规划用递归的方法

2018-09-06 21:21

第一题又是图的遍历,真的不会遍历,反而觉得第二题比较简单

2018-09-06 21:21
2
coder_K3igZ64G 回复 coder_zajgM09t

大佬,求解啊

2018-09-06 21:22
coder_CT3AP2DX 回复 coder_jICWV6tZ

要学会边缘(变圆)OB

2018-09-06 21:22

编程慌得一批,逻辑题居然做了一个小时。。想哭  aaaa

2018-09-06 21:22
3
coder_PNGJDroI 回复 coder_ioddzIta

第二题是最长全1串么,有什么思路?

2018-09-06 21:23

第二题超时了。第一题没学过好气啊。自动驾驶不是嵌入式吗。为啥考一个无向图

2018-09-06 21:23

第一题73%,不清楚哪个边界问题没考虑到。第二题就是01背包问题,注意下状态转移方程就好了,压时通过,惊险刺激。

2018-09-06 21:23
2

第二题暴力解决82%

2018-09-06 21:23
1
coder_XRPZ5P56 回复 coder_zajgM09t

第一题用什么的数据类型,set<pair<int,int>> MLE,求解答大佬

2018-09-06 21:23

最后的编程题,怎么做的啊

2018-09-06 21:24

有大神说一下第一题怎么做么

2018-09-06 21:24
1

就是小明做题目,每个题目可以有几种选择,求得分最高的做法

2018-09-06 21:24
2

图的遍历真得好好学了,第二题还行。

2018-09-06 21:24
coder_XO0Ojln1 回复 coder_ioddzIta

我凑~很无语啊。第二题,本机怎么跑都对,线上跑得就不对。日了啊。也没法输出打印。不知道是不是读取数据错了。好气。

2018-09-06 21:24

第二道题,Python解法,通过了82%,超时了,但是我感觉做到最优化了啊,好难呀

n, k, t = map(int, input().split())
nums = list(map(int, input().split()))
nums_map = {}
temp_nums = nums[:k]
for i in range(0, k):
    nums_map[nums[i]] = temp_nums.count(nums[i])
res = 1 if max(nums_map.values()) >= t else 0
for i in range(1, n-k+1):
    nums_map[nums[i-1]] -= 1
    num = nums_map.get(nums[i + k - 1], None)
    if num:
        nums_map[nums[i + k - 1]] += 1
    else:
        nums_map[nums[i + k - 1]] = 1
    if max(nums_map.values()) >= t:
        res += 1
print(res)


2018-09-06 21:24
coder_MPJJ2GJV 回复 coder_zajgM09t

第二题就是01背包问题,注意下状态转移方程就好了。第一题比较迷,不知道哪个边界条件没考虑到。

2018-09-06 21:24

第一题73%,谁有正确的答案


2018-09-06 21:25
coder_WdOv7xtI 回复 coder_zajgM09t

第二题我也是91%,不知道哪出了问题

2018-09-06 21:25
coder_f7n5RdX6 回复 coder_zajgM09t

求巨佬分享下啊

2018-09-06 21:25
coder_8T9A8DMM 回复 coder_zajgM09t

大佬,求代码

2018-09-06 21:26

哇  疯了  前端的笔试  竟然c++  java   一个js的编程题都没有!

2018-09-06 21:26
1

第一题看到图直接放弃了。第二题一个map储存个数,set储存当前数量大于t的数字。每次循环更新map,实际上只用判断首尾就行,然后根据map更新set。set非空结果加1。

2018-09-06 21:27
coder_4VTD9TRS 回复 coder_MmoZRsiM

貌似每个人第二题不一样啊

2018-09-06 21:27

第二道编程题用hash表做,很简单。虽然方法比较笨,但也没有超时,就是每次移动区间的时候,把移除的数字(相当于key)对应的值减一,移入的加1,然后看所有的键对应的值的最大值有没有大于等于给定的t。

但是这种方法,每次移动区间,都要求键对应的值的最大值,不过此题并没有超时。

至于动态规划,没想到。

2018-09-06 21:28

每个人拿到的编程题不见得一样吧哈哈哈,你们光说第一题第二题,不见得讨论的是同一题哦

2018-09-06 21:28
coder_R2EG69YT 回复 coder_INaUzyu3

贴一下第一题谢谢

2018-09-06 21:28

做完小题时间都没了

2018-09-06 21:28
coder_UBR72BN6 回复 uriel

同python,我也超时了,只通过了68%

2018-09-06 21:29

第二题:

tmp = input().split()
n, k, t = int(tmp[0]), int(tmp[1]), int(tmp[2])
tmp = input().split()
a = [int(i) for i in tmp]
# print(a)

def exist(nums, t):
    import collections
    dic = collections.Counter(nums)
    for key in dic.keys():
        if dic[key] >= t:
            return True
    return False

res = 0
i = 0
while i < len(a)-k+1:
    tmp = a[i:i+k]
    # print(tmp)
    if exist(tmp, t):
        res += 1
    if (i+k < len(a) and ((tmp.count(a[i+k]) >= t-1) or a[i+k] == a[i])):
        # print(i+k)
        i += 2
        res += 1
        continue
    else:
        i += 1


print(res)


2018-09-06 21:29

求第二题小明得分的代码

2018-09-06 21:29
coder_459TFTQR 回复 coder_XO0Ojln1

我也是,本地编译器跑的很6,一到它的环境,就各种不顺。。。。。

2018-09-06 21:29
coder_B5HzjeCz 回复 coder_x5w7THVo

同求

2018-09-06 21:30

第二题

tmp = input().split()
n, k, t = int(tmp[0]), int(tmp[1]), int(tmp[2])
tmp = input().split()
a = [int(i) for i in tmp]
# print(a)

def exist(nums, t):
    import collections
    dic = collections.Counter(nums)
    for key in dic.keys():
        if dic[key] >= t:
            return True
    return False

res = 0
i = 0
while i < len(a)-k+1:
    tmp = a[i:i+k]
    # print(tmp)
    if exist(tmp, t):
        res += 1
    if (i+k < len(a) and ((tmp.count(a[i+k]) >= t-1) or a[i+k] == a[i])):
        # print(i+k)
        i += 2
        res += 1
        continue
    else:
        i += 1


print(res)


2018-09-06 21:30

逻辑题做了一个小时

2018-09-06 21:31
3
coder_A6ZGN4JV 回复 coder_zajgM09t

求分享代码

2018-09-06 21:31
coder_A6ZGN4JV 回复 coder_MPJJ2GJV

求分享代码大佬

2018-09-06 21:32

第一题就是找最长路径,第二题暴力解法只调到82%就没时间了,心累

2018-09-06 21:33
1

我们好像题目不一样啊,怎么编程题我和你们都不一样

2018-09-06 21:34

第一题 空白 没学过图

第二题 python 过了

def check(nums,n,k,t):
    record = dict()
    count = 0
    flag = []
    for i in range(k):
        if record.get(nums[i]):
            record[nums[i]]+=1
        else:
            record[nums[i]]=1
        if record[nums[i]] >= t and (nums[i] not in flag):
            flag.append(nums[i])
    if flag:
        count+=1
    index = 1
    while index<=n-k:
        record[nums[index-1]]-=1
        if nums[index-1] in flag:
            if record[nums[index-1]]<t:
                flag.remove(nums[index-1])
        if record.get(nums[index+k-1]):
            record[nums[index+k-1]]+=1
        else:
            record[nums[index+k-1]]=1
        if record[nums[index+k-1]] >= t and (nums[index+k-1] not in flag):
            flag.append(nums[index+k-1])
        if flag:
            count+=1
        index+=1
    return count

if __name__ == '__main__':
    n, k, t = map(int,raw_input().split())
    nums = raw_input().split()
    print check(nums,n,k,t)


2018-09-06 21:36

哎。。。同时前端,前面的逻辑题和选择题做了好久。。。。。。。。。。编程题挂了。。。。

2018-09-06 21:36

题目不一样,都在这里什么第一题第二题的,能说一下题目再发么

2018-09-06 21:37
coder_V9PP8UAU 回复 uriel

你这复杂度是O(n^2)啊

2018-09-06 21:37

第一题图的遍历,思路 (n-1)*2-图最大遍历深度

AC代码:

#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
#define MAXN 100010
int g[MAXN][100];
int f[MAXN];
int isv[MAXN];
int maxn = 0;

void dfs(int curp,int curs)
{
    int i;
    // 当前节点走过了
    isv[curp] = 1;
    // 当前节点是否全部走过,默认为是
    bool isallv = true;
    for(i=0;i<f[curp];i++){
        if( ! isv[g[curp][i]]){
            // 当前节点的第 i 个子节点没有被走过,那么可以走
            isallv = false;
            dfs(g[curp][i],curs+1);
        }
    }
    if(isallv){
        //当前节点的所有子节点都被走过,那么不能再走了,计算走到这儿的最大深度
        if(curs>maxn)
            maxn = curs;
    }
}

int main()
{
    int n;
    while(scanf("%d",&n)!=EOF){
        if(n==0) break;
        memset(g,0,sizeof(g));
        memset(f,0,sizeof(f));
        memset(isv,0,sizeof(isv));
        for(int i=0;i<n-1;i++){
            int a,b;
            scanf("%d%d",&a,&b);
            g[a][f[a]++] = b;
            g[b][f[b]++] = a;
        }
        dfs(1,0);
        printf("%d\n",(n-1)*2-maxn);
    }
    return 0;
}


2018-09-06 21:41
1
coder_SJz01h1x 回复 coder_sqoSVIhg

…编译环境说了不支持es6啊

2018-09-06 21:42

第二题一直是73%,说一下我的思路,大神帮看看有没有问题:

假设数组是 1 2 2 3 3 4 4 5 5 

k=2 t=2

初始化一个map表示窗口中数的数量,以及一个count,表示滑动窗口中所有>=t的数目,

然后窗口滑动,进入一个数,出去一个数,进入那个数的数量如果刚好==t的话count++,出去那个数的t如果刚好==t-1的话count--。如果count>0说明当前窗口存在>=t的数,则返回值+1

初始化 (1) [1 2] 2 3 3 4 4 5 5 此时 map[1] = 1 map[2]=1; count = 0;

          (2)1 [2 2] 3 3 4 4 5 5 此时 map[1] =0,而map[2] = t,则count++,count大于0则返回值++

          (3)1 2 [2 3] 3 4 4 5 5 此时 map[2] = t-1,说明窗口中>=t的数目在此循环处减1,count--,count==0,返回值不变

          (4)1 2 2 [3 3] 4 4 5 5 同(2)

         ...

时间复杂度O(n)

2018-09-06 21:43
第二个题,java暴力通过82%,之后再优化优化吧

public class Main {
    private static int n,k,t;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String[] arr = sc.nextLine().split(" ");
        n=Integer.parseInt(arr[0]);
        k=Integer.parseInt(arr[1]);
        t=Integer.parseInt(arr[2]);

        int[] list = new int[n];
        for(int i = 0;i<n;i++){
            list[i] = sc.nextInt();
        }

        int count = 0;
        int start = 0;
        int end = start + k - 1;
        while (end < n) {
            if (find(list, start, end)) {
                count++;
            }
            start++;
            end = start + k - 1;
        }
        System.out.println(count);
    }

    /**
     * 计算每个合适的区间
     */
    public static boolean find(int[] arr,int left,int right){
        for(int i=left;i<=right;i++){
            if(count(arr,left,right,arr[i])>=t){
                return true;
            }
        }
        return false;
    }

    /**
     * 每个区间暴力统计重复数值的个数(这里优化!!!)
     */
    public static int count(int[] arr,int left,int right,int num){
        int count=0;
        for(int i=left;i<=right;i++){
            if(arr[i]==num){
                count++;
            }
        }
        return count;
    }

}


2018-09-06 21:45
1

关于  给定N长度的1000010101001 字串 ,允许修改K个0为1,输出最长连续1字串的长度:

我的方法是 给出左右两个指针 left,right,从两端不断向中间移动,直到满足条件:sum[left,right]+K>=right-left+1

N,K = list(map(int, raw_input().split()))
arr = list(map(int, raw_input().split()))

sum_arr = [sum(arr[:n+1]) for n in range(N)]

left = 0
right = N-1

while sum_arr[right] - sum_arr[left] + arr[left] < right-left+1-K:
    if arr[left] == 0:
        left += 1
    elif arr[right] == 0:
        right -= 1
    else:
        i = 1
        while arr[left+i] == arr[right-i] and i<(right-left)/2:
            i += 1
        if arr[left-i] == 0:
            left += 1
        else:
            right -= 1
print(right-left+1)

可怜我没有提交。。。。贴出来,大家看看对不对

2018-09-06 22:03

有大佬看我做到对不

while 1:
    x = input().split(' ')
    n = int(x[0])
    k = int(x[1])
    t = int(x[2])
    nums = input().split()
    for i in range(len(nums)):
        nums[i] = int(nums[i])


    def max_list(lt):
        temp = 0
        for i in lt:
            if lt.count(i) > temp:
                temp = lt.count(i)
        return temp

    res = 0
    for x in range(k):
        l, r = x, x + k
        if max_list(nums[l:r]) >= t:
            res += 1
    print(res)


2018-09-06 22:25
我一个学前端的用c语言写的第一题(排队问题),改了好久算是通过了

#include <stdio.h> 

int main() 

    {   

        int a,b,c,d,e;

        int num=0;

        scanf("%d%d",&a,&b);

        if(a<b){

            c=a;

            a=b;

            b=c;

        }

        d=b;

        e=a+b;

        for(int i=0;i<b;i++){

            e=e-3;

            a=a-2;

            d--;

            num++;

            if(e<3&&a<2&&d<1)break;

        }

    }

prinft("%d",num)


2018-09-06 22:30
coder_sVAvpe24 回复 uriel

跟我的差不多,也是82%然后TLE from collections import Counter rs = 0 for i in range(n-k+1): tmpCounter = Counter(nums[i:i+k]).most_common(1)[0] tmpTimes = tmpCounter[1] if tmpTimes >= t: rs += 1 print(rs)

2018-09-06 22:39
coder_sVAvpe24 回复 coder_7XTXYBA7

➕10086

2018-09-06 22:39
coder_sVAvpe24 回复 coder_ML7OART6

AC了吗,大佬可以贴一下代码不

2018-09-06 22:40
coder_sVAvpe24 回复 coder_8RK68Z6Y

应该是会超时

2018-09-06 22:41
coder_MW4CHDQW 回复 coder_C2GTQTCK

+1

2018-09-07 10:00
添加回复
回到顶部