2021届bilibili笔试2020-08-13场

一堆选择加上三道算法,选择题忽略

1.给出四个数,判断能不能满足24点

暴力枚举所有情况就能通过

class Soltion{
public boolean Game24Points (int[] arr) {
        // write code here
        dfs(0,arr,0);
        return flag;
    }
    boolean flag = false;
    public void dfs(int index,int[] arr,int num) {
        if (index > arr.length - 1 || flag) {
            if (num == 24) {
                flag = true;
            }
            return;
        }
        int r = arr[index];

        for (int i = 0; i < 4; i++) {
            if (i == 0) {
                dfs(index + 1,arr,num + r);
            } else if (i == 1) {
                dfs(index + 1,arr,num - r);
            } else if (i == 2) {
                dfs(index + 1,arr,num * r);
            } else if (i == 3 && r != 0) {
                dfs(index + 1,arr,num / r);
            }
        }

    }
}

2.判断括号是否满足条件,括号有三种:(){}[],不分优先级

经典栈应用

class Solution{
//判断字符串是否有效,()[]{}
    public boolean IsValidExp (String s) {
        if (s == null || s.length() == 0) {
            return true;
        }
        // write code here
        Stack<Character> stack = new Stack<>();
        int i = 0;
        int l = s.length();
        while (i < l) {
            char c = s.charAt(i);
            char out;
            if (c == '(' || c == '[' || c == '{') {
                stack.push(c);
            } else {
                if (stack.isEmpty()) {
                    return false;
                }
                if (c == ')') {
                    out = stack.pop();
                    if (out == '[' || out == '{') {
                        return false;
                    }
                } else if (c == ']') {
                    out = stack.pop();
                    if (out == '(' || out == '{') {
                        return false;
                    }
                } else if (c == '}') {
                    out = stack.pop();
                    if (out == '(' || out == '[') {
                        return false;
                    }
                }

            }
            i++;

        }
        return stack.isEmpty();
    }
}

3.找零问题,最少找多少硬币

解法1贪心:

class Solution{
public int GetCoinCount (int N) {
        //dp
        // write code here
        int sub = 1024 - N;
        int res = 0;
        res += sub/64;
        sub %= 64;
        res += sub/16;
        sub %= 16;
        res += sub/4;
        sub %= 4;
        res += sub/1;
        return res;
}
}

解法2动态规划:

class Solution{
public int GetCoinCount (int N) {
        //dp
        // write code here
        int sub = 1024 - N;
        if (sub == 0) {
            return 0;
        }
        int[] dp = new int[sub + 1];
        dp[1] = 1;
        if (sub >= 4) {
            dp[4] = 1;
        }
        if (sub >= 16) {
            dp[16] = 1;
        }
        if (sub >= 64) {
            dp[64] = 1;
        }
        for (int i = 2; i <= sub; i++) {
            if (i == 4 || i == 16 || i == 64) {
                continue;
            }
            if (i <= 1) {
                dp[i] = 1;
            } else if (i < 4) {
                dp[i] = dp[i - 1] + 1;
            } else if (i < 16) {
                dp[i] = Math.min(dp[i - 1],dp[i - 4]) + 1;
            } else if (i < 64) {
                dp[i] = Math.min(Math.min(dp[i - 1],dp[i - 4]),dp[i - 16]) + 1;
            } else {
                dp[i] = Math.min(Math.min(Math.min(dp[i - 1],dp[i - 4]),dp[i - 16]),dp[i - 64]) + 1;
            }
        }

        //System.out.println("====");
        //System.out.println(Arrays.toString(dp));
        //System.out.println("====");
        return dp[sub];
}
}

解法3,dfs加上备忘录:

class Solution{
	public int GetCoinCount (int N) {
        
        //dp
        // write code here
        int sub = 1024 - N;
        coinDfs(sub,0);
        return min;
     }
	private HashMap<Integer,Integer> map = new HashMap<>(1024);
    private int min = 2000;
    public int coinDfs(int coin,int number) {
        if (coin < 0) {
            return 2001;
        }
        if (coin == 0) {
            min = Math.min(number,min);
            return min;
        }
        if (map.containsKey(coin)) {
            min = Math.min(min,number + map.get(coin));
            return min;
        }
        int t = coinDfs(coin - 64,number + 1);
        t = Math.min(t,coinDfs(coin - 16,number + 1));
        t = Math.min(t,coinDfs(coin - 4,number + 1));
        t = Math.min(t,coinDfs(coin - 1,number + 1));
        map.put(coin,t);
        return t;
    }
}

开始第一反应是dp,但是提交不对,后来用备忘录写了一遍,写一半,发现好像就是贪心,然后,贪心交了,就对了,再把备忘录写完交上去也对。然后我想不通为什么dp不对,一对比,发现当n=1024时候,dp[1]那里会越界,所以就出问题了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值