携程笔试-0905

#软件开发笔面经#

第一题 贪心:
public static void Q1(int n, int k) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < n; i++) {
            if (i < k - 1) {
                sb.append(i + 1);
            } else {
                sb.append(n + k - i - 1);
            }
            if (i != n) {
                sb.append(&quot; &quot;);
            }
        }
        System.out.println(sb.toString());
}

第二题: 暴力超时,改成dp,记录以每个i为结尾的奇偶个字符串的奇偶次变化的数目
public static void Q2(int n, String str) {
        int rs = 0;
        int[][][] dp = new int[n][2][2];
        for (int i = 0; i < n; i++) {
            if (i == 0) {
                dp[i][1][1] = 0;
                dp[i][1][0] = 1;
                continue;
            }
            if (str.charAt(i) != str.charAt(i - 1)) {
                dp[i][1][1] = dp[i - 1][0][0];
                dp[i][1][0] = dp[i - 1][0][1] + 1;
                dp[i][0][1] = dp[i - 1][1][0];
                dp[i][0][0] = dp[i - 1][1][1];
            } else {
                dp[i][1][1] = dp[i - 1][0][1];
                dp[i][1][0] = dp[i - 1][0][0] + 1;
                dp[i][0][1] = dp[i - 1][1][1];
                dp[i][0][0] = dp[i - 1][1][0];
            }
        }
        for (int i = 0; i < n; i++) {
            if (str.charAt(i) == '1') {
                rs += dp[i][1][1];
            } else {
                rs += dp[i][1][0];
            }
        }
        System.out.println(rs);
    }

第三题:极限最后两分钟做完,一直在模拟各种情况,纯纯屎山,自己都看不懂了
public static long Q3(long m, long n, long k) {
        if (m == 1) {
            return n > k ? n - k : 0;
        }
        long rs = n * Q3(m - 1, n);
        String kStr = String.valueOf(k);
        if (kStr.length() < m) {
            return rs;
        }
        if (kStr.length() > m) {
            return 0;
        }

        HashSet<Integer> set = new HashSet<>();
        for (int i = 0; i < m; i++) {
            long count = 0;
            boolean con = true;
            for (int j = 0; j <= n; j++) {
                if (j == 0 &amp;&amp; i == 0) {
                    continue;
                }
                if (set.contains(j)) {
                    continue;
                }
                if (j >= (kStr.charAt(i) - '0')) {
                    set.add(j);
                    con = false;
                    if (j != (kStr.charAt(i) - '0')) {
                        rs -= count * Q3(m - i - 1, n - i);
                        return rs;
                    }
                    if(m == i + 1){
                        count++;
                    }
                    break;
                } else {
                    count++;
                }
            }
            rs -= count * Q3(m - i - 1, n - i);
            if(con){
                break;
            }
        }

        return rs;
    }

    public static long Q3(long m, long n) {
        if(m == 0){
            return 1;
        }
        long rs = 1;
        while (m > 0) {
            rs = rs * n;
            n--;
            m--;
        }
        return rs;
    }

第四题 贪心从最右边开始减:
public static long Q4(int n, int k, long sum, long[] a) {
        long rs = 0;
        long tmp = 0;
        for (int i = 0; i < k - 1; i++) {
            tmp += a[i];
        }
        for (int i = k - 1; i < n; i++) {
            if (i != k - 1) {
                tmp -= a[i - k];
            }
            tmp += a[i];
            int j = i;
            while (tmp > sum) {
                long minus = Math.min(a[j], tmp - sum);
                rs += minus;
                tmp -= minus;
                a[j] -= minus;
                j--;
            }
        }
        return rs;
    }
全部评论

相关推荐

每晚夜里独自颤抖:你cet6就cet6,cet4就cet4,你写个cet证书等是什么意思。专业技能快赶上项目行数,你做的这2个项目哪里能提现你有这么多技能呢
点赞 评论 收藏
分享
06-04 09:27
门头沟学院 Java
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务