暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【算法】8.28小红书笔试AC-2/3

只记录下第一题和第二题是咋做的哈,第三题根本就没见到

AC两道也是白费,因为据传小红书hc在个位数。。。又是几万人抢个位数hc的悲惨剧情。


就当记录一下吧,整体上笔试难度不难,没有动态规划 滑动窗口 回溯等等复杂的算法思维,前两题基本就是模拟题。第三题看蒙了没时间了。


第一题:

排队

题目大意:说有个劳碧登国王,每天的工作啊贼忙,完了还有挺多大臣跟他汇报工作,说有这么一天来了n个大臣汇报工作,然后每个人序号是i,国王为了能快点听完这帮人墨迹就决定设计个算法,让这些大臣根据事情重要程度排序,大臣根据排序进行汇报,每个大臣的汇报会在m个方面各评估一个重要性,每个大臣的汇报重要性就是m个方面的总和,重要性越高排名就越靠前,当然了如果俩人重要性一样就按照序号排序,序号小的排前面。然后这时候序号为id的大臣找到皇家信息技术部门的你,让你帮他算算他第几个汇报。

输入:

第一行三个整数 n m id 分别表示n个大臣,m代表重要性方面数量 id就是找你办事的大臣的序号

然后就是 n行 m列的矩阵。

    3 3 2
    90 90 90
    80 100 90
    80 85 85


    输出:

    输出正整数 表示序号为id的大臣第几个汇报

      2


      思路:

      其实巨简单,就是题目太绕,我是这么做的,上边的矩阵,第一行就代表第一个大臣有三件事汇报,分别占90 90 90的重要度,重要性权重就是270,以此类推,就可以推出每个大臣的重要性权重,存在了sum数组中。


      然后开辟了一个哈希表,映射关系是 id->rank,就是序号为id的大臣的排名的映射关系。

      这里直接一个双重循环,i表示当前id=i的重要性总和,如果i==j就跳过,sum[j]>sum[i]就表示有比 i 大臣 的事情重要的,i 大臣的 rank++;再次就是 sum[i]==sum[j] 的情况,这时候还得比一下谁的id小,id小的就 rank++


      最后把每个人的排名都算完,直接通过题目要求的id get到哈希表中对应的 rank输出就AC了。


            public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
        //输入第一行数据
        String[] strs = sc.nextLine().split(" ");
        int n=Integer.parseInt(strs[0]),m=Integer.parseInt(strs[1]),id=Integer.parseInt(strs[2]);
        //记录每一行的权重
        int[] sum = new int[n+1];
        //输入矩阵数据 直接记录每一行权重和数组
        for(int i=1;i<=n;i++){
        String[] tmpStrs = sc.nextLine().split(" ");
        int tmpSum = 0;
        for(int j=0;j<m;j++){
        tmpSum+=Integer.parseInt(tmpStrs[j]);
        }
        sum[i] = tmpSum;
        }
        //申请哈希表 HashMap<id,paiming>
        HashMap<Integer,Integer> map = new HashMap<>();
        //记录当前id的排名情况
        for(int i=1;i<=n;i++){
        int paiming = 1;
        for(int j=1;j<=n;j++){
        if(i==j)
        continue;
        //如果有比当前权重大的 排名加加
        if(sum[j]>sum[i])
        paiming++;
        //如果权重相等,比较i
        if(sum[i]==sum[j]&&i>j){
        paiming++;
        }
        }
        //最后更新id->排名表
        map.put(i,paiming);
        }
        //输入id对应哈希表即可
        System.out.println(map.get(id));
        }
        }



        第二题:

        法术

        题目大意:说有个魔术它会n种法术,第i种法术的威力是 ai,他会两只手各自释放一种法术,可以达到 威力乘积 的效果,两只手不能释放同一种法术,现在要求他必须释放威力值至少为K,求问有多少种方案。


        输入:

          第一行两个正整数 n和K,表示法术数量和威力值需求
          第二行是n个正整数 (a1,a2,a3,,,,an)

          输出:

            输出威力值至少为K的方案数

            思路:

            双循环暴力法咱也不知道为啥就过了。


                  public static void main(String[] args){
              Scanner sc = new Scanner(System.in);
              while(sc.hasNext()){
              //第一行输入
              String[] firstStrs = sc.nextLine().split(" ");
              int n = Integer.parseInt(firstStrs[0]),K = Integer.parseInt(firstStrs[1]);
              //第二行输入
              String[] secondStrs = sc.nextLine().split(" ");
              int[] magicNums = new int[secondStrs.length];
              for(int i=0;i<magicNums.length;i++)
              magicNums[i] = Integer.parseInt(secondStrs[i]);
              //直接双循环
              int len = magicNums.length;
              //base case
              if(len == 1)
              System.out.println(0);
              int res = 0;
              for(int i=0;i<len;i++){
              for(int j=i+1;j<len;j++){
              if(magicNums[i]*magicNums[j]>=K)
              res=res+2;
              }
              }
              System.out.println(res);
              }
              }


              今年的秋招真是太惨烈了, Winter is coming...



              文章转载自码农智涵的程序人生,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

              评论