看到昨天同学拼多多的笔试题,今天试着写了写,因为自己并没有参加过笔试,写出来的只是我自己能想到的测试用例都过了的,如果有错误,欢迎各位大神指出,仅仅是提供一个解题的想法。而且因为自己基本功不够,写出的程序基本事件复杂度都比较高,也欢迎大神提出优化改进的方法。

  1. 给定两个数组A和B。其中数组A是几乎严格升序排列的,几乎的定义是只需改变其中一个数,即可满足完全升序排列。
    你的任务是从数组A中找到这个数字,并从数组B中选取一个数将其替换,使得数组A是完全严格升序排列的。(严 格升序排列,即不允许相邻两个为相同的数)
    请找出数组B中满足要求的最大数字,并输出最终有序的数组。如果不存在就输出NO. 
    输入描述:
          
    共两行,第一行是数组A,第二行是数组B,元素之间用空格分隔(数组A的长度,数组B的长度< 100)
    输出描述:
           共一行,为最终有序的数组。不存在则输出NO
    示例1

输入

1       3       7       4       10

2      1       5       8       9

输出:

1      3       7       9       0

输入:

20     1       23

50      26     7

输出:

NO

解题思路:这个的解题思路的重点在于改变A[index]和A[index-1]都有可能组成一个升序数组,其中index是定位到的A[index]<A[index-1]的位置。有一点值得注意,改变A[index]如果有值的话肯定会大于A[index-1],只有在A[index]没有符合要求值的情况才会考虑A[index-1],可以减少时间。

import java.util.Scanner;
public class First {
    public static void main(String ars[]){
        Scanner scanner=new Scanner(System.in);
        int[] arrA = parseInts(scanner.nextLine().split(" "));
        int[] arrB = parseInts(scanner.nextLine().split(" "));

int res[]=changeToSort(arrA,arrB);
        if(res==null){
            System.out.println("No");
        }else{
            for(int r:res){
                System.out.print(r+" ");
            }
        }

}

public static int[] changeToSort(int A[],int B[]){
        if(A==null||B==null||A.length==0||B.length==0)
            return null;
        int index=Integer.MAX_VALUE;
        for(int i=1;i<A.length;i++){
            if(A[i]<A[i-1]){
                index=i;
                break;
            }
        }
        int max=Integer.MIN_VALUE;
        if(index==A.length-1){
            for(int i=0;i<B.length;i++){
                if(B[i]>A[index-1]&&max<B[i])
                    max=B[i];
            }
            if(max==Integer.MIN_VALUE){
                index--;
                for(int i=0;i<B.length;i++){
                    if(B[i]>max&&B[i]>A[index-1]&&B[i]<A[index+1])
                        max=B[i];
                }
               
            }
        }else{
            for(int i=0;i<B.length;i++){
                if(B[i]>A[index-1]&&B[i]<A[index+1]&&max<B[i])
                    max=B[i];
            }
            if(max==Integer.MIN_VALUE&&A[index]<A[index+1]){
                index--;
                for(int i=0;i<B.length;i++){
                    if(index-1>0){
                        if(B[i]>A[index-1]&&B[i]<A[index+1]&&max<B[i])
                            max=B[i];
                    }else{
                        if(B[i]<A[index+1]&&max<B[i])
                            max=B[i];
                    }
                }

}
        }
        if(max==Integer.MIN_VALUE){
            return null;
        }
        A[index]=max;
        return A;
    }
//这边只是一个函数转换,把字符串变成int类的数组
    private static int[] parseInts(String[] strArr) {
        if (strArr == null || strArr.length == 0) {
            return new int[0];
        }
        int[] intArr = new int[strArr.length];
        for (int i = 0; i < intArr.length; i++) {
            intArr[i] = Integer.parseInt(strArr[i]);
        }
        return intArr;
    }

}

2.给定一个字符串数组(字符串长度和数组的长度均大于1且小于1024),所有字符均为大写字母。请问,给定的字符串数组是否能通过更换数组中元素的顺序,从而首尾相连,形成一个环,环上相邻字符串首尾衔接的字符相同。
输入描述:
        
一行输入,空格分隔,表示字符串数组。
输出描述:
        
一行输出, 返回true或者false,表示是否可以形成环。
例:

输入:

CAT    TIGER   RPC

输出:

true

输入:

CAT   RPC

输出:

False

这个题我的想法是只要每一个字符串可以找到与之相连的字符串并且和别人找到的不重复就可以,所以用了两个循环

import java.util.Scanner;public class Second {public static void main(String ars[]){Scanner scanner=new Scanner(System.in);String string=scanner.nextLine();String[] str=string.split(" ");System.out.println(test(str));}public static boolean test(String strs[]){int length=strs.length;//这边把数组里面少于1的都算作false;if(length<=1||strs==null)return false;if(length==2)return strs[0].charAt(strs[0].length()-1)==strs[1].charAt(0)&&strs[1].charAt(strs[0].length()-1)==strs[0].charAt(0);int[] nums=new int[length];boolean[] isEmpty=new boolean[length];for(int i=0;i<length;i++){nums[i]=-1;}for(int i=0;i<length;i++){int lengthTemp=strs[i].length()-1;for(int j=0;j<length;j++){//如果首尾可以相连且没有j没有指向i(主要是为了防止两个形成循环)// 且j没有被别的指向过(防止几个指向同一个)           if(nums[j]!=i&&j!=i&&!isEmpty[j]&&strs[i].charAt(lengthTemp)==strs[j].charAt(0)){nums[i]=j;isEmpty[j]=true;break;}}}for (int i=0;i<length;i++){if(!isEmpty[i]){return false;}}return true;}}

3  多多鸡在公司负责一个分布式任务执行平台的维护。夏天到了,平台的服务器都因中暑而无法执行任务了。所以多多鸡必须自己手动来执行每个任务!
      现在一共有N个待执行的任务,每个任务多多鸡需要P1的时间完成执行。同时,任务之间可能会有一些依赖关系。比如任务1可能依赖任务2和任务3,那么任务1必须在任务2和任务3都执行完成后才能执行。
      多多鸡只有一个人,所以同时只能执行一个任务,并且在任务完成之前不能暂停切换去执行其他任务。 为了提升平台用户的使用体验,多多鸡希望最小化任务的平均返回时长。一个任务的返回时长定义为任务执行完成时刻减去平台接收到该任务的时刻。在零时间,所有N个任务都已经被平台接收。请你帮多多鸡安排下任务执行顺序,使得平均返回时长最
小。
 输入描述:
      第一行包含2个正整数N、M,分别表示任务数量以及M个任务依赖关系。
      第二行包含N个正整数,第i(1<=1<=N)个数表示第i个任务的处理时间Pi。
    接下来的M行,每行表示一个任务依赖关系。每行包含2个整数Ai(1<=Ai<=N)、B1(1<=Bi<=N),表示第B1个任务依赖于第A1个任务。数据保证不会出现循环依赖的情况。数据范围:
         1<=N<=1000

1<=M<=50000

1<=P1<=10000
 输出描述:
      输出一行,包含N个整数(两两之间用一个空格符分隔),其中第i(1<=i<=N)个整数表示多多鸡执行的第i个任务的编号。若有多种可行方案,则输出字典序最小(优先执行编号轮小的任务的方案。

例:

输入:

5   6

1   2    1     1    1

1   2

1   3

1   4

2   5

3   5

4    5

输出:

1        3       4       2       5   (输出的是执行顺序);

解题思路:这就是个优先级加编号和时间的问题。先对所有的排优先级,在优先级相同的情况下选出时间短的和编号在前的。

import java.util.ArrayList;import java.util.List;import java.util.Scanner;
public class Third {public static void main(String args[]){Scanner sc=new Scanner(System.in);int N=sc.nextInt();int M=sc.nextInt();int times[]=new int[N];int dependencies[][]=new int[M][2];for(int i=0;i<N;i++){times[i]=sc.nextInt();}for(int i=0;i<M;i++){for(int j=0;j<2;j++){dependencies[i][j]=sc.nextInt();}}int result[]=runnSort(N,M,times,dependencies);for(int re:result)System.out.print(re+" ");}public static int[] runnSort(int n,int m,int[] times,int[][] des){if(n<=0||m<=0)return null;boolean[][] isDes=new boolean[n][n];int res[]=new int[n];//确定依赖关系,我这边定义的是,如果i->(依赖)j,则isDes[i][j]=truefor(int i=0;i<m;i++){isDes[des[i][1]-1][des[i][0]-1]=true;}int counts[]=new int[n];//确定优先级,依赖越多,优先级的数字越大,优先级越低for(int i=0;i<n;i++){counts[i]=1;for (int j=0;j<n;j++){if(j!=i&&isDes[i][j])counts[i]++;}}int key=1;int k=0;//length用来记录以及处理了哪些,等全部处理完跳出循环int length=n;while (length>0){//肯定有优先级为1的,不然没法开始List<Integer>list=new ArrayList<>();for (int i=0;i<n;i++){if(counts[i]==key)list.add(i);}key++;if(list.size()==0)continue;length-=list.size();//以下是在优先级相同的情况下按照时间短和编号顺序排列while (list.size()>0){int max=Integer.MAX_VALUE,index=-1;for(int i=0;i<list.size();i++){if(max>times[list.get(i)]){max=times[list.get(i)];index=i;}}res[k++]=list.get(index)+1;list.remove(index);}}return res;}}

4.   多多鸡宝宝在玩搭积木游戏。有N个长方体积木,每个积木的高都是1,长宽都为Li,重量为Wi。
      现在多多鸡宝宝想要用这些积木搭一个高高的金字塔。他打算金字塔的每一层是由且仅由一块积木组成,同时每一层的积木边长都严格比在其下方的积木小。
      在多次尝试之后,多多鸡宝宝发现每块积木只能承受自身重量的7倍重量,一若超过7倍自重,搭建的金字塔会因此变得不稳定。具体来说即:对于每一块积木,在其上方的积木重量之和必须小于等于其自重的7倍。
      多多鸡宝宝想请你帮他计算一下最高可以搭一个多高的金字塔?
 数据范围:
 1<=N<=100

1<=Li<=1000

1<=Wi<=1000
输入描述:
 第一行包含1个正整数N,表示积木的数量。

第二行包含N个正整数,第i个数表示第i个积木的长度Li。

第三行包含N个正整数,第i个数表示第i个积木的重量Wi
输出描述:

输出占一行,近包含一个整数,表示可以搭出金字塔的最高高度。

例:

输入:

10

1    2       3       4       5       6       7       8       9      10

1    1       1        1       1        1      1       1        1      10

输出:

9

解题思路:我个人觉得这个跟动态规划里面的信封问题类似,甚至说他比信封问题更简单,信封问题要考虑长和宽,由于这个长宽是一致的,考虑长就可以。他在信封问题的改变在于多加了一个重量的参数,考虑长和宽就变成了考虑体积和重量。这个题目可以从上面往下面堆,这样做的好处就是你可以仅仅考虑当前块能不能承受,而不用考虑前一块。因为前一块能够成立的话,在计算他的时候肯定就已经确定了他可以承受前面的重量。用动态规划来做。

import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
public class Four {public static void main(String args[]){Scanner sc=new Scanner(System.in);int n=sc.nextInt();int work[][]=new int[n][2];for(int i=0;i<n;i++){work[i][0]=sc.nextInt();}int wi[]=new int[n];for(int i=0;i<n;i++){work[i][1]=sc.nextInt();}System.out.println(Ta(work));}public static  int Ta(int[][] arr ){if(arr==null&&arr.length==0&&arr[0].length==0)return 0;int length=arr.length;//对每个积木进行排序,先按照边长排序,边长相同的按照重量排序Arrays.sort(arr, new Comparator<int[]>(){public int compare(int[] o1,int [] o2){//判断第一个元素是否相等if (o1[0] == o2[0]) {return o1[1] - o2[1];} else {return o1[0] - o2[0];}}});//一个二维数组,nums[i][0]用来记录当前最多叠了几层,nums[i][1]用来表示当前积木所有的重量int nums[][]=new int[length][2];for(int i=0;i<length;i++){nums[i][0]=1;nums[i][1]=arr[i][1];for(int j=0;j<i;j++){if(nums[j][1]<=arr[i][1]*7&&nums[j][0]+1>nums[i][0]){nums[i][0]=nums[j][0]+1;nums[i][1]=nums[j][1]+arr[i][1];//下面的主要是为了替换得到更少的重量。}else if(nums[j][0]+1==nums[i][0]&&nums[j][1]+arr[i][1]<nums[i][1]){nums[i][1]=nums[j][1]+arr[i][1];}}}int max=nums[0][0];for(int i=0;i<length;i++){if(nums[i][0]>max)max=nums[i][0];}return max;}}
 

拼多多提前批(7月28号笔试题相关推荐

  1. 使命召唤19发布时间曝光 确定将于10月28号发布

    作为年货游戏的使命召唤系列,在今天正式官宣了新作<使命召唤19>的发布时间,将于10月28号发售,下面就一起来看看详细内容吧. 使命召唤19发布时间曝光 确定将于10月28号发布 在不久前 ...

  2. 10月28号安全焦点DDOS事件背后内幕串串烧

    文章整理:安全焦点论坛 作者:cloudx 发布时间:2006-11-09 主题:讲述安焦被DDOS背后的故事及部分安全知识!同时奉送ASP.NET备份db日志获得webshell小知识,小小伎俩,牛 ...

  3. 10月28号安全焦点DDOS事件背后内幕串串烧~~

    主题:讲述安焦被DDOS背后的故事及部分安全知识!同时奉送ASP.NET备份db日志获得webshell小知识,小小伎俩,牛人莫笑话俺了. 本贴纯属娱乐大众!慰安下各位fans在安焦被D 9天以来无法 ...

  4. 芯讯通1月28号晚上八点直播-C-V2X产业链生态思考,关注易贸智慧互联公众号免费收听...

    演讲人:严永杰 芯讯通SIMCom 汽车车载业务负责人,主要负责从事车载前装通信/V2X市场业务合作和推广,对接整车企业,Tire1 企业的业务开拓以及项目合作,同时积极参与智能网联汽车联盟C-V2X ...

  5. 11 为了进一步_小米11正式官宣!12月28号整装待发,这几点或成关键

    虽说今年搭载骁龙888芯片的手机有不少,但是能够抢到首发的还是仅此小米一家.就在昨天,雷军正式宣布了小米11将在12月28正式与大家见面.听到这个消息,在一次激起小米11的讨论热潮.今年是小米首次进军 ...

  6. JuJu团队12月28号工作汇报

    JuJu团队12月28号工作汇报 JuJu Scrum 团队成员 今日工作 剩余任务 困难 飞飞 完成GUI 待安排 无 婷婷 调试代码 提升acc 无 恩升 修正evaluate 修正evaluat ...

  7. 海外权威媒体好评连连,一加5T中国11月28号发布

    北京时间11月17日,一加手机"A New View"海外新品发布会正式在美国纽约举行,全面屏双摄旗舰一加5T的真容终于揭开.目前,一加国内官网预热页面已经上线,官方消息宣布国内发 ...

  8. 2009年2月28号发现,上海移动升级GPRS时出问题,导致一些用户话费被扣钱,甚至停机...

    2009年2月28号发现,上海移动升级GPRS时出问题,导致一些用户话费被扣,甚至停机 一月份吃过亏,因为GPRS流量超过,被扣了98块钱,尽管后来退回一部分,但是还是扣了20多元. 2月份就比较小心 ...

  9. html中新闻标题字数的限制,微博再无140字数限制 2月28号全面开放

    [PConline 资讯]1月28号消息,新浪微博App放弃140字的字数限制,但暂时只有会员可以体验这个功能,预计在2月28号对全用户进行开放.版本号为v 6.0.0 Beta 据悉新浪微博开放平台 ...

最新文章

  1. 解读Python的命名空间
  2. SVO 学习笔记(三)
  3. Hexo Next 博客添加相册瀑布流
  4. Docker镜像、容器数据卷和Dockerfile
  5. 未来IT的三驾马车:AI、物联网和混合云
  6. 【PAT乙级】1029 旧键盘 (20 分)
  7. 如何用“区块链+稳定币”技术来提升资产证券化市场运作效率
  8. AtomicIntegerArray和AtomicIntegerFieldUpdater
  9. (转)linux sort 命令详解
  10. Unity3D ----- 制作信息滚动提示(NGUI)
  11. Android热修复升级探索——代码修复冷启动方案 1
  12. (转)EBWin辞典下载资源
  13. android 圆形自定义进度条,自定义Android圆形进度条(附源码)
  14. DSP2812入门2——结构资源性能
  15. [数值计算-1]:数学建模、科学计算、数值计算的关系
  16. PCAN二次开发,用MFC发送一帧CAN消息
  17. 在用户输入手机号或者要求输入纯数字时,输入法自动切换到数字的代码
  18. ROS Spinning-----简介
  19. 微信公众号视频录制开发 踩坑汇总
  20. 脱敏数据的残余风险评估

热门文章

  1. 手把手教你用JAVA实现“语音合成”功能(文字转声音)标贝科技
  2. 康蒂尼药业再次冲刺港股:9个月营收4.4亿 龙磐创投是股东
  3. 干货 :六招教你用Python分分钟构建好玩的深度学习应用
  4. mac恢复出厂设置_如何恢复Mac的出厂设置
  5. 文案排版(参考中文文案排版指北)
  6. 水生火热的互联网金融
  7. ubuntu安装与卸载deb文件
  8. Web课程设计-仿当当网-增删改查-java+jsp+mysql-期末大作业
  9. STM32G0 硬件SPI+DMA+LL库,最高通讯速率32MBit/s
  10. 数仓建设之IP库的匹配