滴滴java双ac代码

这次选择题感觉做的还好,编程题都ac,要是还没面试机会真的ri dog了。。。

状态转移没找出来,全部遍历了,有更好的吗?

package company.didi._20170910._01;

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNextInt()) {
            int n = in.nextInt();
            int[] arr = new int[n];
            for (int i = 0; i < n; ++i) {
                arr[i] = in.nextInt();
            }
            int result = process(arr, n);
            System.out.println(result);
        }
    }

    private static int process(int[] arr, int n) {
        int[][] dp = new int[n + 1][n + 1];
        int[][] xor = new int[n + 1][n + 1];
        int i, j;
        for (i = 1; i <= n; ++i) {
            dp[i][i] = arr[i - 1] == 0 ? 1 : 0;
            xor[i][i] = arr[i - 1];
        }
        for (j = 1; j <= n - 1; ++j) {
            for (i = 1; i <= n - j; ++i) {
                dp[i][i + j] = f(arr, dp, xor, i, i + j);
            }
        }
        return dp[1][n];
    }

    private static int f(int[] arr, int[][] dp, int[][] xor, int l, int r) {
        xor[l][r] = xor[l][r - 1] ^ arr[r - 1];
        int max = xor[l][r] == 0 ? 1 : 0;
        for (int i = l; i < r; ++i) {
            max = Math.max(max, dp[l][i] + dp[i + 1][r]);
        }
        return max;
    }

}

leetcode原题。。。

package company.didi._20170910._02;

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNextInt()) {
            int n = in.nextInt();
            int result = process(n);
            System.out.println(result);
        }
    }

    private static int process(int n) {
        int[] base = new int[]{2, 3, 5};
        int len = 3;
        int[] index = new int[len];
        int[] ugly = new int[n];
        ugly[0] = 1;
        int i = 1, j, min;
        while (i < n) {
            min = Integer.MAX_VALUE;
            for (j = 0; j < len; j++) {
                min = Math.min(min, ugly[index[j]] * base[j]);
            }
            for (j = 0; j < len; j++) {
                if (min == ugly[index[j]] * base[j]) {
                    ++index[j];
                }
            }
            ugly[i++] = min;
        }
        return ugly[n - 1];
    }

}
#滴滴#
全部评论
第一题,可以说说一下你的思路吗
点赞 回复
分享
发布于 2017-09-10 17:13
#include <iostream> #include <set> int main() { int N; while (std::cin >> N) { int val, xor_val, ans = 0; std::set<int> s; for (int i = 0; i < N; ++i) { scanf("%d", &val); //如果输入0, 则ans+1, 并重新开始计算 if (val == 0) { ++ans; s.clear(); } //每次重新开始计算时, 第一个元素直接存储 else if (s.size() == 0) { xor_val = val; s.insert(xor_val); } else { xor_val = xor_val ^ val; if (s.find(xor_val) != s.end() || xor_val == 0) { ++ans; s.clear(); } else { s.insert(xor_val); } } } std::cout << ans << std::endl; } return 0; }
点赞 回复
分享
发布于 2017-09-10 18:51
滴滴
校招火热招聘中
官网直投

相关推荐

点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务