百度笔试 3.22

2.包含相等0和1的最长区间

给出一个长度为n的01串,现在请你找到两个区间,使得这两个区间中0和I的个数相等。 两个区间可以相交,但是不可以完全重叠,即两个区间的左右端点不可以完全相问。 现在请你找到两个最长的区问,满足以上要求。
输入
11011
输出
1 4 2 5 //最长区间为[1,4],[2,5]
class Solution {
    private static final int INF = 100005;
    public int[] getIndex(String str){
        int len = str.length();
        int left = 0;
        int right = len - 1;
        int maxLen = 0;
        int[] res = new int[4];
        if(str.charAt(left) == str.charAt(right))
            return new int[]{left + 1,right,left + 2,right + 1};
        while (right > 1){
            right--;
            if(str.charAt(0) == str.charAt(right)){
                maxLen = right;
                res[0] = 1;
                res[1] = right;
                res[2] = 2;
                res[3] = right + 1;
                break;
            }

        }
        
    }

3.快递耗时

牛牛是一个快递员,负责n个乡村的快递配送,乡村编号从1到n,快选站设在s号多村,牛牛将从快递站开始,依次配送q件快递到目的乡村。

乡村与乡村之间,存在着m条单向道路以及k条双向通路,已知通过每条道路所需要在费的时间,而且,任意两个乡村之间都存在至少一条通路。

每个乡村都有一个容量充足的快递柜,对于第i件快递而言,假i设到达目的乡村时用总耗时为t(包括前:i-1件快递的配送用时),如果t为奇故,牛牛就会通知收货人当面取快递(该操作耗时a个单位时间),否则牛牛就会将快递放入快递柜中(该操作耗时b个单位时间)。

不需要考虑其它任何额外因素对耗时的影响。

当这件快递安排妥当之后,即:第t+a或者第t+b时刻开始,牛牛踏上从了i件快递目的乡村前往第i+1件快递目的乡村的道路。

假设在配送路途中牛牛总是挑选的耗时最短的路径,那么,当牛牛配送完有的q件快递再回到快递站休息的总耗时是多少?

输入
3 0 3 1
1 2 3
3 2 6
1 3 9
6 3 3
1 2 3
输出
30
class Solution {
    private static final int INF = 100005;    
	 /**
     * @param n 乡村数量
     * @param m 单向道路数量
     * @param k 双向道路数量
     * @param s 快递站所在乡村编号
     * @param oneRoad 单向道路代价
     * @param doubleRoad 双向道路代价
     * @param a 当面取件耗时
     * @param b 投放快递柜耗时
     * @param q 快递总数量
     * @param homeNum 快递配送地点编号
     * @return 所需最短时间
     */
    //!可能存在重边和自环,有向图两点之间最短距离
    public int sumTime(int n, int m, int k, int s, int[][] oneRoad,int[][] doubleRoad,int a,int b,int q,int[] homeNum){
        int time = 0;
        int station = s;
        int index = s;//快递员目前所在位置
        int[][] graph = buildGraph(oneRoad, doubleRoad, n);
        int[][] dist = getDist(graph,n);
        for (int num : homeNum){
            int roadWeight = dist[index][num];
            if(index == num)
               roadWeight = 0;
            time += roadWeight;
            if(time % 2 == 1)
                time += a;
            else
                time += b;
            index = num;
        }
        time += dist[index][station];
        return time;
    }

    public int[][] buildGraph(int[][] oneRoad, int[][] doubleRoad, int n){//创建图
        int[][] graph = new int[n + 1][n + 1];
        for (int i = 0; i < n + 1; i++) {
            Arrays.fill(graph[i],INF);
        }
        for (int i = 0; i < oneRoad.length; i++) {
            int from = oneRoad[i][0];
            int to = oneRoad[i][1];
            int weight = oneRoad[i][2];
            graph[from][to] = Math.min(graph[from][to],weight);
        }

        for (int i = 0; i < doubleRoad.length; i++) {
            int from = doubleRoad[i][0];
            int to = doubleRoad[i][1];
            int weight = doubleRoad[i][2];
            graph[from][to] = Math.min(graph[from][to],weight);
            graph[to][from] = Math.min(graph[to][from],weight);
        }

        return graph;
    }

    public int[][] getDist(int[][] matrix, int n){//计算最短路径长度
        int len = n + 1;
        int[][] dist = new int[len][len];
        for(int i = 0; i < len; i++) {
            for(int j = 0; j < len; j++) {
                dist[i][j] = matrix[i][j];   //顶点 'i' 到 顶点 'j' 的路径长度为 'i' 到 'j'的权值
            }
        }
        //计算最短路径
        for(int i = 0; i < len; i++) {
            for(int j = 0; j < len; j++) {
                for(int k = 0; k < len; k++) {
                    //如果经过下标为k顶点路径比原两点间路径更短,则更新dist[j][k] 和 path[j][k]
                    int temp = (dist[j][i] == INF || dist[i][k] == INF) ? INF : (dist[j][i] + dist[i][k]);
                    if(dist[j][k] > temp) {
                        // 'j' 到 'k'最短路径 对应的值,为更小的一个(经过k)
                        dist[j][k] = temp;
                    }
                }
            }
        }

        return dist;
    }


}






#百度实习##百度##笔经#
全部评论
第三题n太大了,可以只求出现在q中的点
2 回复 分享
发布于 2022-03-22 23:10
感谢大佬分享思路,不过第二题代码有误吧,应该是考虑两端的0和两端的1,然后取区间较大者,比如0111111这个例子就不对,请楼主指教😅
4 回复 分享
发布于 2022-03-23 16:29
01 这题代码是错误的
点赞 回复 分享
发布于 2023-05-29 16:54 湖南
第三题可以给n m q的取值范围嘛?
点赞 回复 分享
发布于 2022-03-29 10:08
请问除了编程题,有选择题吗,多少?
点赞 回复 分享
发布于 2022-03-28 11:34
春招的小伙伴看过来呀~~~ 同学你好,我们是阿里巴巴大淘宝技术用户运营平台商家平台团队,欢迎同学咨询和投递哦,投递地址:nanwan.xf@alibaba-inc.com  团队介绍  • 我们是淘系商家平台技术团队,用技术和产品能力,构建支撑商家持续经营的基础设施,数据化的为商家带来新的增长。  • 在技术上,我们精益求精,用端到端的技术平台,直面百万级别的QPS,为商家生意的爆发保驾护航。  • 在业务上,我们勇于突破,带领和支撑集团战略级的战役(如旗舰店2.0、星巴克等),从而推动整个淘宝天猫的增长。  • 在人才上,我们渴望怀揣着有技术梦想的同学加入我们团队,一起为阿里巴巴零售体系的未来布局。 我们做什么  • 构建和升级商家运营阵地和商业化机制,链接商家全渠道业务数据(线上、线下、淘内、淘外),集成商家个性化的服务,打造数据驱动的商家增长技术平台,为商家和品牌带来生意的持续增长。  • 我们的挑战和技术内核: a. 百万QPS高并发系统 b. 千亿数据量的离在线实时计算体系 c. 面向整个电商体系的商家Growth技术平台 d. 支撑全集团的跨端联动的技术体系 e. 服务百万商家的PaaS+SaaS端到端架构 f. 支撑阿里电商体系战略级项目
点赞 回复 分享
发布于 2022-03-24 11:53
有回复了么
点赞 回复 分享
发布于 2022-03-24 11:52
老哥,01这题能说思路吗?
点赞 回复 分享
发布于 2022-03-22 23:06
dalao第三题快递是ac嘛
点赞 回复 分享
发布于 2022-03-22 22:24

相关推荐

今天 11:18
门头沟学院 Java
作者先叠个甲:本人双非本,秋招拿到了多个大厂offer,这个过程也不容易,但是在看到很多秋招胜利之后说自己一路有多艰辛的文章,总感觉有一点不对劲,想了很久打算写一篇文章分析一下,本文仅代表作者观点,不认同的可以在评论区大家一起理性讨论。&nbsp;秋招已经结束,各类社交平台出现一大批“大厂上岸”胜利结算。文章的叙事逻辑高度相同,开篇就渲染焦虑和困惑,学习时的挑灯夜读、投递时的屡屡碰壁、面试时的如履薄冰,将过往经历包装成一步艰辛的“奋斗史”,然后最终以大厂offer的胜利结尾,字里行间全是苦尽甘来的优越感。但是在我看来,这类文章的本质是结果导向的、带有浮夸的叙事,因为其内核不是分享经验,而是借“苦难”之名...
创作小队长:你的批判视角非常犀利,尤其“结果决定叙事权”的洞察非常精准,哈哈想邀请你来成为我们的创作者🫰 但我想补充一个视角:许多分享者的初衷并非炫耀结果或者苦难,我更愿意相信他们在这个过程中付出了很多,在这场战役结束后,他们迫不及待地想被看到,记录和分享都是给自己的一个交代,而非真的教会别人什么,他们的初衷未必是想制造焦虑。求职市场的残酷、经济环境的下行、世俗价值观才是这种叙事流行的土壤,作为一个普通人无法抵抗洪流。 感谢你发起这场讨论。理想的社区,既需要这样锐利的批判来保持清醒,你的洞察非常犀利,也许会启发一些人,能逐渐改变这种叙事~
点赞 评论 收藏
分享
评论
2
26
分享

创作者周榜

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