一(85)

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

入:
1 5 4 9
1 2 3 4 5 6 7 8 9
出:
1 5 8 9

需要考虑的情况

  1. 长度为1
  2. 长度为2 ,相同 或 乱序不同。
  3. 长度大于等于3

长度大于等于3的有三种情况:

  1. 3 3 5 前两个相同,改第一个第二个都行
  2. 3 3 4 前两个相同,只能改第一个
  3. 2 4 4 末尾两个相同,改第一个第二个都行
  4. 3 4 4 末尾两个相同,只能改第二个
  5. 4 2 6 改中间

其中12可以合并,34可以合并。
因为遍历数组B,所以情况2改第二个与情况4改第一个,肯定找不到。

import java.util.Arrays;
import java.util.Scanner;public class Test1 {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);String line1 = scanner.nextLine();String line2 = scanner.nextLine();String[] line1split = line1.split(" ");String[] line2split = line2.split(" ");int[] arr1 = new int[line1split.length];int i = 0;for (String s : line1split) {arr1[i++] = Integer.valueOf(s);}int[] arr2 = new int[line2split.length];i = 0;for (String s : line2split) {arr2[i++] = Integer.valueOf(s);}if (arr1.length == 0 || arr2.length == 0) {System.out.println("NO");return;}boolean res = findNumberIndex(arr1, arr2);if (res) {for (int k = 0; k < arr1.length - 1; k++) {System.out.print(arr1[k] + " ");}System.out.println(arr1[arr1.length - 1]);} else {System.out.println("NO");}}public static boolean findNumberIndex(int[] arr1, int[] arr2) {if (arr1.length >= 3) {for (int i = 1; i < arr1.length - 1; i++) {if (arr1[i - 1] >= arr1[i] && arr1[i + 1] >= arr1[i]) {int max = Integer.MIN_VALUE;if (arr1[i - 1] == arr1[i]) {// 改后for (int j = 0; j < arr2.length; j++) {if (arr2[j] > arr1[i - 1] && arr2[j] < arr1[i + 1]) {max = Math.max(max, arr2[j]);}}if (max != Integer.MIN_VALUE) {arr1[i] = max;return true;}// 改前for (int j = 0; j < arr2.length; j++) {if (i - 2 >= 0) {if (arr2[j] > arr1[i - 2] && arr2[j] < arr1[i]) {max = Math.max(max, arr2[j]);}} else {if (arr2[j] < arr1[i]) {max = Math.max(max, arr2[j]);}}}if (max != Integer.MIN_VALUE) {arr1[i - 1] = max;return true;}} else {// 5 3 7for (int j = 0; j < arr2.length; j++) {if (arr2[j] > arr1[i - 1] && arr2[j] < arr1[i + 1]) {max = Math.max(max, arr2[j]);}}}if (max != Integer.MIN_VALUE) {arr1[i] = max;return true;} else {return false;}}}if (arr1[arr1.length - 2] >= arr1[arr1.length - 1]) {int max = Integer.MIN_VALUE;for (int j = 0; j < arr2.length; j++) {if (arr2[j] > arr1[arr1.length - 2]) {max = Math.max(max, arr2[j]);}}if (max != Integer.MIN_VALUE) {arr1[arr1.length - 1] = max;return true;} else {return false;}}} else if (arr1.length == 2) {if (arr1[0] >= arr1[1]) {int max = Integer.MIN_VALUE;for (int j = 0; j < arr2.length; j++) {if (arr2[j] < arr1[1]) {max = Math.max(max, arr2[j]);}}if (max != Integer.MIN_VALUE) {arr1[0] = max;return true;} else {return false;}} else {return true;}}return true;}
}

二(100)

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

示例

1.
CAT TAB BADC
true
2.
CAT TAB
false
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;public class Test2 {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);String line = scanner.nextLine();String[] lineSplit = line.split(" ");Map<Character, Integer> map = new HashMap<>();int i = 0;for (String s : lineSplit) {map.put(s.charAt(0), map.getOrDefault(s.charAt(0), 0) + 1);map.put(s.charAt(s.length() - 1), map.getOrDefault(s.charAt(s.length() - 1), 0) + 1);}boolean res = true;for (Map.Entry<Character, Integer> entry : map.entrySet()) {if (entry.getValue() % 2 == 1){res = false;}}System.out.println(res);}
}

三(100)

单线程完成任务,要求平均时长最短,返回时长为完成任务时刻-接收任务时刻。假设,零时,接收全部任务。
任务有依赖关系。
输入:
N M n个任务耗费,m个依赖关系
X X X… N个耗费
X Y Y依赖于X, X需要先完成
输出:
任务完成序列 (字典序最小)

示例输入:

5 6
1 2 1 1 1
1 2
1 3
1 4
2 5
3 5
4 5
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;public class Test3 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt(); // n个节点int m = sc.nextInt(); // m个关系sc.nextLine();Node[] nodes = new Node[n];for (int i = 0; i < n; i++) {nodes[i] = new Node();nodes[i].cost = sc.nextInt();nodes[i].index = i + 1; // 从1开始}sc.nextLine();// 构建图for (int i = 0; i < m; i++) {int from = sc.nextInt() - 1;int to = sc.nextInt() - 1;sc.nextLine();nodes[from].nexts.add(nodes[to]);nodes[to].rudu++;}int deleteCount = 0;List<Integer> res = new ArrayList<>();while (deleteCount < n) {boolean isHaveRudu0 = false;ArrayList<Node> deleteNodeSet = new ArrayList<>();for (int i = 0; i < n; i++) {Node node = nodes[i];if (node != null) {if (node.rudu == 0) {isHaveRudu0 = true;deleteNodeSet.add(node);}}}deleteNodeSet.sort(new Comparator<Node>() {@Overridepublic int compare(Node o1, Node o2) {int res1 = Integer.compare(o1.cost, o2.cost);if (res1 == 0) {return Integer.compare(o1.index, o2.index);}return res1;}});if (isHaveRudu0) {Node node = deleteNodeSet.get(0);// 删除nodes[node.index - 1] = null;res.add(node.index);deleteCount++;for (Node nn : node.nexts) {nn.rudu--;}} else {return;}}for (int i = 0; i < res.size() - 1; i++) {System.out.print(res.get(i) + " ");}System.out.println(res.get(res.size() - 1));}static class Node {int cost = 0;int rudu = 0;int index = -1;List<Node> nexts = new ArrayList<>();}
}

四(5)

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

入:
10
1 2 3 4 5 6 7 8 9 10
1 1 1 1 1 1 1 1 1 10
出:
9
package shen.leetcode.solution.bishi.pinduoduo;import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;public class Test4 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();sc.nextLine();Jm[] arr = new Jm[n];for (int i = 0; i < n; i++) {arr[i] = new Jm();arr[i].length = sc.nextInt();arr[i].index = i;}sc.nextLine();for (int i = 0; i < n; i++) {arr[i].weight = sc.nextInt();}Arrays.sort(arr, (o1, o2) -> Integer.compare(o2.length, o1.length));if (arr.length == 0) return;System.out.println(putFirst(arr));}// 放第一个public static int putFirst(Jm[] jms) {List<Jm> jmList = new ArrayList<>();int maxLength = jms[0].length;int nextLengthIndex = 0;// 选择当前所有边长一样的(最长的)for (int i = 0; i < jms.length; i++) {if (jms[i].length == maxLength) {jmList.add(jms[i]);nextLengthIndex = i;} else {break;}}nextLengthIndex++;int maxHeight = 0;// 肯定选重的,先排个序jmList.sort((o1, o2) -> Integer.compare(o2.weight, o1.weight));// 递归求解上面的答案maxHeight = Math.max(maxHeight, putJM(jms, nextLengthIndex, jmList.get(0).weight * 7));// 返回高度 + 当前板子return maxHeight + 1;}public static int putJM(Jm[] jms, int curLengthIndex, int currentMinWeight) {// 如果所有长度都放完了,或者 已经无法承受重量了,返回高度0if (curLengthIndex >= jms.length || currentMinWeight <= 0) {return 0;}// 当前准备拿的积木列表List<Jm> jmList = new ArrayList<>();int curMaxLength = jms[curLengthIndex].length;int nextLengthIndex = 0;// 选择当前所有边长一样的for (int i = curLengthIndex; i < jms.length; i++) {if (jms[i].length == curMaxLength) {jmList.add(jms[i]);nextLengthIndex = i;} else {break;}}// 跳到下一个积木长度的索引nextLengthIndex++;int maxHeight = 0;// 当前这一层是否可以放boolean isCurChaoZhong = true;for (Jm jm : jmList) {// 不能超重if (jm.weight <= currentMinWeight) {// 可以放就不超重isCurChaoZhong = false;// 不超重情况下,计算一下,下一层的承受重量currentMinWeight = Math.min(currentMinWeight - jm.weight, jm.weight * 7);maxHeight = Math.max(maxHeight, putJM(jms, nextLengthIndex, currentMinWeight));}}// 当前层不超重,结果可以+1,即使maxHeight是0if (!isCurChaoZhong) {maxHeight++;}return maxHeight;}static class Jm {int weight;int length;int index;}
}

2019提前批——拼多多笔试题相关推荐

  1. 拼多多笔试题 回合制游戏

    拼多多笔试题 回合制游戏 题目描述 解法1(深度优先搜索) 解法2(数学规律) 昨晚心血来潮,拿了一份校招真题练练手,无奈这道题一直没有AC,只有75%的通过率,用了深度优先搜索+记忆化搜索最终还是会 ...

  2. 校招拼多多笔试题(前端工程师)

    考试时间:2017-09-02-提前批内推-笔试 1) 测试代码如下: var a = {}; b = { key: 'b' }; c = { key: 'c' }; a[b] = 123; a[c] ...

  3. 乐鑫科技2021提前批软件类笔试题

    ```自己写的蛮烂,将就看看,给个建议啥的最好了 // 乐鑫科技2021提前批软件类笔试 // 题目大意:构建家族树,输出两个家族成员的辈分,亲属关系,其中亲属关系,父子为1.兄弟为2 // 输入:第 ...

  4. 腾讯2019暑期实习生提前批CV岗笔试题

    目录 第一题 题意 思路 代码 第二题 题意 思路 代码 第三题 题意 思路 代码 第四题 题意 思路 代码 第五题 题意 思路 代码 笔试共有5道编程题,每道题20分,两个小时.以下内容的编写全凭记 ...

  5. 拼多多笔试题(三):多多的电子字典

    问题描述: 多多鸡打算造一本自己的电子字典,里面的所有单词都只由a和b组成. 每个单词的组成里a的数量不能超过N个且b的数量不能超过M个. 多多鸡的幸运数字是K,它打算把所有满足条件的单词里的字典序第 ...

  6. 拼多多笔试题(一):多多的魔术盒子

    问题描述:  多多鸡有N个魔术盒子(编号1-N),其中编号为i的盒子里有i个球. 多多鸡让皮皮虾每次选择一个数字X(1 <= X <= N),多多鸡就会把球数量大于等于X个的盒子里的球减少 ...

  7. python 拼多多秒杀_关于 拼多多笔试题-简单易懂的秒杀服务

    实现一个简易的秒杀服务,有3个接口: 1. 添加一个秒杀活动 addActivity(int startTime, int endTime, int goodsId, int limitQuantit ...

  8. [Nowcoder] 大整数相乘(拼多多笔试题)

    有两个用字符串表示的非常大的大整数,算出他们的乘积,也是用字符串表示.不能用系统自带的大整数类型. 输入描述: 空格分隔的两个字符串,代表输入的两个大整数 输出描述: 输入的乘积,用字符串表示 输入例 ...

  9. 拼多多笔试题 回合制角色扮演

    题目描述 你在玩一个回合制角色扮演的游戏.现在你在准备一个策略,以便在最短的回合内击败敌方角色.在战斗开始时,敌人拥有HP格血量.当血量小于等于0时,敌人死去.一个缺乏经验的玩家可能简单地尝试每个回合 ...

最新文章

  1. mysql开发规范最新版本_MYSQL 开发规范
  2. Altium Designer Exception ESocketError in module X2.EXE at 001B15CF (10107) on API 'Socket'
  3. 终于知道PUBWIN2009的数据库用户名与密码已经成功连接
  4. 让云×××—微软虚拟化远程直播
  5. typescript的命名空间
  6. VsCode git报错 git add -A -- xxx is outside repository
  7. c语言创建一个根结点,创建一个由10个节点组成的二叉树结构,并按前根、中根、后根对该二叉树进行遍历,并输出遍历结果(c语言)...
  8. python apache_Windows 配置 Apache Python CGI
  9. 如何避免ajax重复请求?
  10. vscode插件安装失败的解决方案
  11. 分形之科赫(Koch)雪花
  12. 探讨如何在有着1000万条数据的MS SQL SERVER数据库中实现快速的数据提取和数据分页...
  13. JSP 标准标签库(JSTL)(菜鸟教程)
  14. 图像影音型计算机主板选择什么,开启4K新时代 七款家用影音主板推荐
  15. 05JavaScript输出
  16. mac安装win7之后鼠标失灵_2013款mac air及一体机安装win7 键盘鼠标失灵的解决方法...
  17. 成都Uber优步司机奖励政策(2月29日)
  18. Python的scrapy之爬取6毛小说网
  19. VS2010中水晶报表插件下载安装方法 详细出处参考:http://www.jb51.net/softjc/88860.html
  20. 遇到电脑任务栏卡死怎么办

热门文章

  1. 手把手教你用JAVA实现“语音合成”功能(文字转声音)标贝科技
  2. 名帖236 俞和 行书《次韵韩伯清见寄之什凡五首》
  3. keras实现回归预测
  4. 初等证明:费马商的加法分配律证明
  5. 第十三届蓝桥杯大赛软件组省赛 Python大学A组 个人题解
  6. 创业公司如何分配股权?
  7. 视频:忆童年有摇杆,《暗黑破坏神3》街机版演示
  8. 单片机上电后没有运转,需要从这些方面考虑
  9. 数据可视化大屏的应用与落地实践
  10. 一次解决找不到 android.support.v7.XXX 问题