Java算法:牛客网拼多多笔试真题算法Java版1-13题
生活随笔
收集整理的這篇文章主要介紹了
Java算法:牛客网拼多多笔试真题算法Java版1-13题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題號 題目 知識點 難度 通過率 PDD1 最大乘積 貪心模擬 中等 14.45%PDD2 大整數相乘 模擬 中等 27.32%PDD3 六一兒童節 貪心 中等 24.74%PDD4 迷宮尋路 模擬 中等 14.77%PDD5 列表補全 數組模擬 簡單 21.09%PDD6 拼多多周年慶 動態規劃貪心樹圖 較難 23.93%PDD7 數三角形 模擬排序窮舉 中等 23.72%PDD8 最大乘積 貪心模擬 中等 21.08%PDD9 小熊吃糖 排序數組模擬貪心 簡單 24.97%PDD10 選靚號 字符串貪心 較難 15.29%PDD11 種樹 遞歸數組貪心 中等 15.95%PDD12 兩兩配對差值最小 排序貪心數組 簡單 38.52%PDD13 回合制游戲 貪心 簡單 24.09%
PDD1 最大乘積
題目描述
給定一個無序數組,包含正數、負數和0,要求從中找出3個數的乘積,使得乘積最大,要求時間復雜度:O(n),空間復雜度:O(1)輸入描述:
輸入共2行,第一行包括一個整數n,表示數組長度 第二行為n個以空格隔開的整數,分別為A1,A2, … ,An輸出描述:
滿足條件的最大乘積示例1
輸入
4 3 4 1 2輸出
24 import java.io.*; public class Main {public static void main(String[] args) throws Exception {BufferedReader in = new BufferedReader(new InputStreamReader(System.in));int n = Integer.parseInt(in.readLine());String[] data = in.readLine().split(" ");long max1 = Integer.MIN_VALUE;long max2 = Integer.MIN_VALUE;long max3 = Integer.MIN_VALUE;long min1 = Integer.MAX_VALUE;long min2 = Integer.MAX_VALUE;for (String num : data) {int temp = Integer.parseInt(num);if (temp > max1) {max3 = max2;max2 = max1;max1 = temp;} else if (temp > max2) {max3 = max2;max2 = temp;} else if (temp > max3) {max3 = temp;}//找最小的兩個數if (temp < min1) {min2 = min1;min1 = temp;} else if (temp < min2) {min2 = temp;}}long max = Integer.MIN_VALUE;max = Math.max(max, max1 * max2 * max3);max = Math.max(max, max1 * min1 * min2);System.out.println(max);} }PDD2 大整數相乘
題目描述
有兩個用字符串表示的非常大的大整數,算出他們的乘積,也是用字符串表示。不能用系統自帶的大整數類型。輸入描述:
空格分隔的兩個字符串,代表輸入的兩個大整數輸出描述:
輸入的乘積,用字符串表示示例1
輸入
72106547548473106236 982161082972751393輸出
70820244829634538040848656466105986748 import java.util.*; import java.io.*; public class Main {public String mul(String num1, String num2) {int[] nums1 = new int[num1.length()], nums2 = new int[num2.length()];int[] res = new int[num1.length() + num2.length()];for (int i = num1.length() - 1; i >= 0; i--) {nums1[i] = num1.charAt(num1.length() - 1 - i) - '0';}for (int i = num2.length() - 1; i >= 0; i--) {nums2[i] = num2.charAt(num2.length() - 1 - i) - '0';}for (int i = 0; i < num1.length(); i++) {for (int j = 0; j < num2.length(); j++) {res[i + j] += nums1[i] * nums2[j];}}//進位和留位for (int i = 1; i < res.length; i++) {//進位res[i] += res[i - 1] / 10;//留位res[i - 1] = res[i - 1] % 10;}StringBuilder buffer = new StringBuilder();boolean start = false;for (int i = res.length - 1; i >= 0; i--) {if (!start && res[i] == 0) continue;else start = true;buffer.append(res[i]);}return buffer.toString();}public static void main(String[] args) throws IOException {Main c = new Main();BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));String input = bf.readLine();String[] inputs = input.split(" ");String res = c.mul(inputs[0], inputs[1]);System.out.println(res);} }PDD3 六一兒童節
題目描述
六一兒童節,老師帶了很多好吃的巧克力到幼兒園。每塊巧克力j的重量為w[j],對于每個小朋友i,當他分到的巧克力大小達到h[i] (即w[j]>=h[i]),他才會上去表演節目。老師的目標是將巧克力分發給孩子們,使得最多的小孩上臺表演。可以保證每個w[i]> 0且不能將多塊巧克力分給一個孩子或將一塊分給多個孩子。輸入描述:
第一行:n,表示h數組元素個數第二行:n個h數組元素第三行:m,表示w數組元素個數第四行:m個w數組元素輸出描述:
上臺表演學生人數示例1
輸入
3 <br> 2 2 3<br> 2<br> 3 1輸出
1 import java.util.*; import java.io.*; import java.io.BufferedReader; public class Main {public static void main(String[] args) throws IOException {InputStreamReader ir = new InputStreamReader(System.in);BufferedReader bf = new BufferedReader(ir);int n = Integer.parseInt(bf.readLine());String[] str1 = bf.readLine().split(" ");int m = Integer.parseInt(bf.readLine());String[] str2 = bf.readLine().split(" ");int[] h = new int[n];int[] w = new int[m];for (int i = 0; i < h.length; i++) {h[i] = Integer.parseInt(str1[i]);}for (int i = 0; i < w.length; i++) {w[i] = Integer.parseInt(str2[i]);}Arrays.sort(w);Arrays.sort(h);int ans = 0;int i = 0, j = 0;while (i < n && j < m) {if (h[i] <= w[j]) {ans++;i++;}j++;}System.out.println(ans);} }PDD4 迷宮尋路
題目描述
假設一個探險家被困在了地底的迷宮之中,要從當前位置開始找到一條通往迷宮出口的路徑。迷宮可以用一個二維矩陣組成,有的部分是墻,有的部分是路。迷宮之中有的路上還有門,每扇門都在迷宮的某個地方有與之匹配的鑰匙,只有先拿到鑰匙才能打開門。請設計一個算法,幫助探險家找到脫困的最短路徑。如前所述,迷宮是通過一個二維矩陣表示的,每個元素的值的含義如下 0-墻,1-路,2-探險家的起始位置,3-迷宮的出口,大寫字母-門,小寫字母-對應大寫字母所代表的門的鑰匙輸入描述:
迷宮的地圖,用二維矩陣表示。第一行是表示矩陣的行數和列數M和N 后面的M行是矩陣的數據,每一行對應與矩陣的一行(中間沒有空格)。M和N都不超過100, 門不超過10扇。輸出描述:
路徑的長度,是一個整數示例1
輸入
5 5 02111 01a0A 01003 01001 01111輸出
7 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.LinkedList; class Node {int x;int y;int keys;int step;Node(int x, int y, int keys, int step) {this.x = x;this.y = y;this.keys = keys;this.step = step;} } public class Main {public static int[][] dir = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};public static int m;public static int n;public static char[][] maze;public static boolean[][][] visit;public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));String[] strs = br.readLine().split(" ");m = Integer.parseInt(strs[0]);n = Integer.parseInt(strs[1]);maze = new char[m][n];visit = new boolean[m][n][1024];for (int i = 0; i < m; i++) {maze[i] = br.readLine().toCharArray();}int res = 0;for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {if (maze[i][j] == '2') res = bfs(i, j);}}System.out.println(res);}private static int bfs(int x, int y) {LinkedList<Node> queue = new LinkedList<>();queue.add(new Node(x, y, 0, 0));visit[x][y][0] = true;while (!queue.isEmpty()) {Node node = queue.poll();for (int i = 0; i < 4; i++) {int nx = node.x + dir[i][0], ny = node.y + dir[i][1];if (nx < 0 || nx >= m || ny < 0 || ny >= n || maze[nx][ny] == '0') continue;if (maze[nx][ny] == '3') return node.step + 1;if (maze[nx][ny] >= 'A' && maze[nx][ny] <= 'Z' && ((node.keys & (1 << (maze[nx][ny] - 'A'))) == 0))continue;int keys = node.keys;if (maze[nx][ny] >= 'a' && maze[nx][ny] <= 'z') keys = node.keys | (1 << (maze[nx][ny] - 'a'));if (!visit[nx][ny][keys]) {visit[nx][ny][keys] = true;queue.offer(new Node(nx, ny, keys, node.step + 1));}}}return -1;} }PDD5 列表補全
題目描述
在商城的某個位置有一個商品列表,該列表是由L1、L2兩個子列表拼接而成。當用戶瀏覽并翻頁時,需要從列表L1、L2中獲取商品進行展示。展示規則如下: 1. 用戶可以進行多次翻頁,用offset表示用戶在之前頁面已經瀏覽的商品數量,比如offset為4,表示用戶已經看了4個商品 2. n表示當前頁面需要展示的商品數量 3. 展示商品時首先使用列表L1,如果列表L1長度不夠,再從列表L2中選取商品 4. 從列表L2中補全商品時,也可能存在數量不足的情況 請根據上述規則,計算列表L1和L2中哪些商品在當前頁面被展示了輸入描述:
每個測試輸入包含1個測試用例,包含四個整數,分別表示偏移量offset、元素數量n,列表L1的長度l1,列表L2的長度l2。輸出描述:
在一行內輸出四個整數分別表示L1和L2的區間start1,end1,start2,end2,每個數字之間有一個空格。 注意,區間段使用半開半閉區間表示,即包含起點,不包含終點。如果某個列表的區間為空,使用[0, 0)表示,如果某個列表被跳過,使用[len, len)表示,len表示列表的長度。示例1
輸入
2 4 4 4 1 2 4 4 4 1 3 3輸出
2 4 0 2 1 3 0 0 3 3 1 2 import java.io.BufferedReader; import java.io.InputStreamReader; public class Main {public static void main(String[] args) throws Exception {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));String str;while ((str = br.readLine()) != null) {String[] strings = str.split(" ");int offset = Integer.parseInt(strings[0]);//用戶已經看過的商品數量int n = Integer.parseInt(strings[1]);//需要展示的商品數量int l1 = Integer.parseInt(strings[2]);//列表L1的長度int l2 = Integer.parseInt(strings[3]);//列表L2的長度//分類討論//特判 偏移量達到或超過列表1的長度,此時只能使用列表2if (offset >= l1) {int temp = offset - l1;//列表2使用的起始行//列表2也完全沒用if (temp >= l2) System.out.println(l1 + " " + l1 + " " + l2 + " " + l2);//列表2也不夠用else if (temp + n >= l2) System.out.print(l1 + " " + l1 + " " + temp + " " + l2);else System.out.println(l1 + " " + l1 + " " + temp + " " + (temp + n));}//特判 需要展示的商品數量加上偏移量未超過列表1的長度,只使用列表1else if (offset + n <= l1) System.out.println(offset + " " + (offset + n) + " " + 0 + " " + 0);//普通情況else System.out.println(offset + " " + l1 + " " + 0 + " " + (n - (l1 - offset)));}} }PDD6 拼多多周年慶
題目描述
拼多多王國的城市和道路的拓撲結構比較特別,是一個樹狀結構: 1. 每個城市是樹的一個節點; 2. 城市之間的道路是樹的一條邊; 3. 樹的根節點是首都。 拼多多周年慶馬上就要到了,這是拼多多王國的一個大日子。為了活躍氣氛,國王想在道路上布置花燈。花燈可是很貴的東西,盡管國王想要在所有道路上都布置花燈,但是如果要花太多錢的話,是過不了財政大臣那一關的。國王把這個計劃告訴財政大臣,最后他們商討出來這么一個方案: 1. 一條道路要么不布置花燈,要么整條布置花燈,不能選擇其中的某一段布置; 2. 除非沒有道路通向首都,否則至少為一條通向首都的道路布置花燈; 3. 所有布置花燈的道路構成的子圖是連通的,這保證國王從首都出發,能通過只走布置了花燈的道路,把所有的花燈游覽完; 4. 如果某個城市(包括首都)有大于等于2條道路通向子城市,為了防止鋪張浪費,最多只能選擇其中的兩條路布置花燈; 5. 布置花燈的道路的總長度設定一個上限。 在上述方案下,國王想要使得布置花燈的道路長度越長越好,你幫國王想想辦法。輸入描述:
每個測試輸入包含1個測試用例。 輸入的第一行是一個正整數m,0<m<=9900,表示布置花燈的道路的總長度的上限。 輸入的第二行是一個正整數n,n<=100,表示城市的個數。 緊接著是n-1行輸入,每行三個正整數u、v、d,表示下標為u的城市有一條長度為d的道路通向它的一個子城市v,其中0<=u<n,0<=v<n,0<d<=100。輸出描述:
輸出一個正整數,表示能布置花燈的道路長度的最大值示例1
輸入
5 5 0 1 1 0 2 2 0 3 3 0 4 4輸出
5 import java.util.*; import java.io.*; public class Main {static class TreeNode {int val;int parent = -1;//把子節點和權值分開存儲ArrayList<TreeNode> child = new ArrayList<>();ArrayList<Integer> dist = new ArrayList<>();public TreeNode(int val) {this.val = val;}}public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int limit = scanner.nextInt();int n = scanner.nextInt();TreeNode[] treeNodes = new TreeNode[n];for (int i = 0; i < n; i++) {treeNodes[i] = new TreeNode(i);}for (int i = 0; i < n - 1; i++) {int parent = scanner.nextInt();int child = scanner.nextInt();int dist = scanner.nextInt();treeNodes[parent].child.add(treeNodes[child]);treeNodes[child].parent = parent;treeNodes[parent].dist.add(dist);}//找到根節點TreeNode root = null;for (int i = 0; i < n; i++) {if (treeNodes[i].parent == -1) {root = treeNodes[i];break;}}HashSet<Integer> set = getPath(root, limit);int max = Integer.MIN_VALUE;for (int len : set) {max = Math.max(max, len);}System.out.println(max);}private static HashSet<Integer> getPath(TreeNode root, int limit) { //limit不變HashSet<Integer> set = new HashSet<>();set.add(0);if (root == null) return set;//保持連通是通過從子樹往上遞歸ArrayList<HashSet<Integer>> arr = new ArrayList<>();for (int i = 0; i < root.child.size(); i++) {HashSet<Integer> childSet = getPath(root.child.get(i), limit); //以第一個參數為根節點的處理方法arr.add(childSet);}// one pathfor (int i = 0; i < arr.size(); i++) {int d = root.dist.get(i);//最少選一條路for (int path : arr.get(i)) {if (path + d <= limit) set.add(path + d);}//最多選兩條for (int j = i + 1; j < arr.size(); j++) {int d2 = root.dist.get(j);for (int path1 : arr.get(i)) {for (int path2 : arr.get(j)) {if (path1 + path2 + d + d2 <= limit) set.add(path1 + path2 + d + d2);}}}}return set;} }PDD7 數三角形
題目描述
給出平面上的n個點,現在需要你求出,在這n個點里選3個點能構成一個三角形的方案有幾種。輸入描述:
第一行包含一個正整數n,表示平面上有n個點(n <= 100) 第2行到第n + 1行,每行有兩個整數,表示這個點的x坐標和y坐標。(所有坐標的絕對值小于等于100,且保證所有坐標不同)輸出描述:
輸出一個數,表示能構成三角形的方案數。示例1
輸入
4 0 0 0 1 1 0 1 1輸出
4 說明 4個點中任意選擇3個都能構成三角形 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; import java.util.Comparator; public class Main {static class Node {int x, y;Node(int x, int y) {this.x = x;this.y = y;}}public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));int n = Integer.parseInt(br.readLine());Node[] nodes = new Node[n];for (int i = 0; i < n; i++) {String[] line = br.readLine().trim().split(" ");nodes[i] = new Node(Integer.parseInt(line[0]), Integer.parseInt(line[1]));}int res = 0;for (int i = 0; i < nodes.length - 2; i++) {for (int j = i + 1; j < nodes.length - 1; j++) {for (int k = j + 1; k < nodes.length; k++) {if ((nodes[j].y - nodes[i].y) * (nodes[k].x - nodes[i].x) != (nodes[k].y - nodes[i].y) * (nodes[j].x - nodes[i].x)) {res++;}}}}System.out.println(res);} }PDD8 最大乘積
題目描述
給定一個無序數組,包含正數、負數和0,要求從中找出3個數的乘積,使得乘積最大,要求時間復雜度:O(n),空間復雜度:O(1)。 n<=1e5。輸入描述:
第一行是數組大小n,第二行是無序整數數組A[n]輸出描述:
滿足條件的最大乘積示例1
輸入
4 3 4 1 2輸出
24 import java.io.BufferedReader; import java.io.InputStreamReader; //一組數字取三個,使其乘積最大 public class Main {public static void main(String[] args) throws Exception {BufferedReader in = new BufferedReader(new InputStreamReader(System.in));int n = Integer.parseInt(in.readLine());String[] data = in.readLine().split(" ");long max1 = Integer.MIN_VALUE;long max2 = Integer.MIN_VALUE;long max3 = Integer.MIN_VALUE;long min1 = Integer.MAX_VALUE;long min2 = Integer.MAX_VALUE;for (String num : data) {int temp = Integer.parseInt(num);// 找最大的三個數if (temp > max1) {max3 = max2;max2 = max1;max1 = temp;} else if (temp > max2) {max3 = max2;max2 = temp;} else if (temp > max3) {max3 = temp;}//找最小的兩個數if (temp < min1) {min2 = min1;min1 = temp;} else if (temp < min2) {min2 = temp;}}long max = Integer.MIN_VALUE;max = Math.max(max, max1 * max2 * max3);max = Math.max(max, max1 * min1 * min2);System.out.println(max);} }PDD9 小熊吃糖
題目描述
有n只小熊,他們有著各不相同的戰斗力。每次他們吃糖時,會按照戰斗力來排,戰斗力高的小熊擁有優先選擇權。前面的小熊吃飽了,后面的小熊才能吃。每只小熊有一個饑餓值,每次進食的時候,小熊們會選擇最大的能填飽自己當前饑餓值的那顆糖來吃,可能吃完沒飽會重復上述過程,但不會選擇吃撐。 現在給出n只小熊的戰斗力和饑餓值,并且給出m顆糖能填飽的饑餓值。 求所有小熊進食完之后,每只小熊剩余的饑餓值。輸入描述:
第一行兩個正整數n和m,分別表示小熊數量和糖的數量。(n <= 10, m <= 100) 第二行m個正整數,每個表示著顆糖能填充的饑餓值。 接下來的n行,每行2個正整數,分別代表每只小熊的戰斗力和當前饑餓值。 題目中所有輸入的數值小于等于100。輸出描述:
輸出n行,每行一個整數,代表每只小熊剩余的饑餓值。示例1
輸入
2 5 5 6 10 20 30 4 34 3 35輸出
4 0 說明 第一只小熊吃了第5顆糖 第二只小熊吃了第4顆糖 第二只小熊吃了第3顆糖 第二只小熊吃了第1顆糖 import java.io.*; import java.util.*; public class Main {public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));String[] line1 = br.readLine().trim().split(" ");int n = Integer.parseInt(line1[0]); // 小熊數量int m = Integer.parseInt(line1[1]); // 糖的數量String[] line2 = br.readLine().trim().split(" ");int[] sweets = new int[m]; // 每顆糖能填充的饑餓值int[] eated = new int[m]; // 標識糖是否被吃掉for (int i = 0; i < m; i++) {sweets[i] = Integer.parseInt(line2[i]);}// 糖按大小遞增排序Arrays.sort(sweets);int[] energy = new int[n]; // 每只熊的戰斗力int[] hungry = new int[n]; // 每只熊的當前饑餓值int[] full = new int[n]; // 標識該熊是否吃過了for (int i = 0; i < n; i++) {String[] arr = br.readLine().trim().split(" ");energy[i] = Integer.parseInt(arr[0]);hungry[i] = Integer.parseInt(arr[1]);}// 每次找剩下戰斗力最大的熊for (int i = 0; i < n; i++) {int max = Integer.MIN_VALUE;int p = -1;for (int j = 0; j < n; j++) {if (full[j] == 0 && energy[j] > max) {p = j;max = energy[j];}}full[p] = 1;// 吃糖for (int j = m - 1; j >= 0; j--) {if (hungry[p] >= sweets[j] && eated[j] == 0) {hungry[p] -= sweets[j];eated[j] = 1;}}}for (int i = 0; i < n; i++) {System.out.println(hungry[i]);}} }PDD10 選靚號
題目描述
A 國的手機號碼由且僅由 N 位十進制數字(0-9)組成。一個手機號碼中有至少 K 位數字相同則被定義為靚號。A 國的手機號可以有前導零,比如 000123456 是一個合法的手機號。 小多想花錢將自己的手機號碼修改為一個靚號。修改號碼中的一個數字需要花費的金額為新數字與舊數字之間的差值。比如將 1 修改為 6 或 6 修改為 1 都需要花 5 塊錢。 給出小多現在的手機號碼,問將其修改成一個靚號,最少需要多少錢?輸入描述:
第一行包含2個整數 N、K,分別表示手機號碼數字個數以及靚號至少有 K 個數字相同。 第二行包含 N 個字符,每個字符都是一個數字('0'-'9'),數字之間沒有任何其他空白符。表示小多的手機號碼。 數據范圍: 2 <= K <= N <= 10000輸出描述:
第一行包含一個整數,表示修改成一個靚號,最少需要的金額。 第二行包含 N 個數字字符,表示最少花費修改的新手機號。若有多個靚號花費都最少,則輸出字典序最小的靚號。示例1
輸入
6 5 787585輸出
4 777577 說明 花費為4的方案有兩種:777577與777775,前者字典序更小。 import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; import java.util.Arrays; public class Main {public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));String[] strArr = br.readLine().trim().split(" ");int n = Integer.parseInt(strArr[0]), k = Integer.parseInt(strArr[1]);char[] phoneNum = br.readLine().trim().toCharArray();solve(n, k, phoneNum);}private static void solve(int n, int k, char[] phoneNum) {int minCost = Integer.MAX_VALUE;char[] newPhoneNum = new char[n];// 先得到原本號碼中各數字出現的次數int[] counter = getCounter(phoneNum);for (int curNum = 0; curNum < 10; curNum++) {// 依次計算將數字curNum改到k次需要多大的代價if (counter[curNum] >= k) {// 已經滿足靚號要求minCost = 0;newPhoneNum = phoneNum;break;}int curNumCost = 0;int upperLimitNum = curNum + 1; // 將upperLimitNum改成curNumint lowerLimitNum = curNum - 1; // 將lowerLimitNum改成curNumchar[] tempPhoneNum = Arrays.copyOfRange(phoneNum, 0, phoneNum.length);// 還需要的重復次數int remain = k - counter[curNum];// 循環直至不再需要數字重復while (remain > 0) {// 比curNum大的數字從前往后改(盡量把前面的數改小,以保證字典序小)if (upperLimitNum < 10) {for (int i = 0; i < n && remain > 0; i++) {if (phoneNum[i] - '0' == upperLimitNum) {curNumCost += upperLimitNum - curNum;tempPhoneNum[i] = (char) (curNum + '0');remain--;}}}// 比curNum小的數字從后往前改(盡量把后面的數改大,以保證字典序小)if (lowerLimitNum >= 0) {for (int i = n - 1; i >= 0 && remain > 0; i--) {if (phoneNum[i] - '0' == lowerLimitNum) {curNumCost += curNum - lowerLimitNum;tempPhoneNum[i] = (char) (curNum + '0');remain--;}}}// 如果改完了upperLimitNum和lowerLimitNum還沒達到k次重復,就擴大上下限繼續改upperLimitNum++;lowerLimitNum--;}if (curNumCost < minCost) {minCost = curNumCost;newPhoneNum = tempPhoneNum;}}System.out.println(minCost);System.out.println(newPhoneNum);}private static int[] getCounter(char[] phoneNum) {int[] counter = new int[10];for (char c : phoneNum) counter[c - '0']++;return counter;} }PDD11 種樹
題目描述
小多想在美化一下自己的莊園。他的莊園毗鄰一條小河,他希望在河邊種一排樹,共 M 棵。小多采購了 N 個品種的樹,每個品種的數量是 Ai (樹的總數量恰好為 M)。但是他希望任意兩棵相鄰的樹不是同一品種的。小多請你幫忙設計一種滿足要求的種樹方案。輸入描述:
第一行包含一個正整數 N,表示樹的品種數量。 第二行包含 N 個正整數,第 i (1 <= i <= N) 個數表示第 i 個品種的樹的數量。 數據范圍: 1 <= N <= 1000 1 <= M <= 2000輸出描述:
輸出一行,包含 M 個正整數,分別表示第 i 棵樹的品種編號 (品種編號從1到 N)。若存在多種可行方案,則輸出字典序最小的方案。若不存在滿足條件的方案,則輸出"-"。示例1
輸入
3 4 2 1輸出
1 2 1 2 1 3 1 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; import java.util.Comparator; public class Main {public static void main(String[] args) throws IOException {BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));int n = Integer.parseInt(bf.readLine());int[] arr = new int[n];int cnt = 0, max = 0;String[] s = bf.readLine().split(" ");for (int i = 0; i < n; i++) {arr[i] = Integer.parseInt(s[i]);cnt += arr[i];max = Math.max(max, arr[i]);}//如果有樹的個數>(總個數+1)/2 就不存在序列if (max > (cnt + 1) >> 1) {System.out.print("-");return;}StringBuilder sb = new StringBuilder();int pre = -1;while (cnt > 0) {int preCnt = cnt;//如果有樹的個數大于剩余總數的1/2,選這種樹for (int i = 0; i < n; i++) {if (arr[i] > cnt >> 1) {arr[i]--;pre = i;sb.append(i + 1);sb.append(" ");cnt--;break;}}if (preCnt != cnt) continue;//如果沒有,選擇序號最小的 還有剩余的 上次沒選的樹int j = 0;while (pre == j || arr[j] == 0) j++;arr[j]--;pre = j;sb.append(j + 1);sb.append(" ");cnt--;}sb.deleteCharAt(sb.length() - 1);System.out.print(sb);} }PDD12 兩兩配對差值最小
題目描述
給定一個長度為偶數的數組arr,將該數組中的數字兩兩配對并求和,在這些和中選出最大和最小值,請問該如何兩兩配對,才能讓最大值和最小值的差值最小?輸入描述:
一共2行輸入。 第一行為一個整數n,2<=n<=10000, 第二行為n個數,組成目標數組,每個數大于等于2,小于等于100。輸出描述:
輸出最小的差值。示例1
輸入
4 2 6 4 3輸出
1 示例2 輸入 6 11 4 3 5 7 1輸出
3 import java.util.*; import java.io.*; public class Main {public static void main(String[] args) throws IOException {BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));int len = Integer.parseInt(bf.readLine());int[] nums = new int[len];String[] p = bf.readLine().split(" ");for (int i = 0; i < len; i++) {nums[i] = Integer.parseInt(p[i]);}Arrays.sort(nums);int left = 0;int right = len - 1;int min = 200;int max = 4;while (left < right) {min = Math.min(nums[left] + nums[right], min);max = Math.max(nums[left] + nums[right], max);left++;right--;}System.out.println(max - min);} }PDD13 回合制游戲
題目描述
你在玩一個回合制角色扮演的游戲。現在你在準備一個策略,以便在最短的回合內擊敗敵方角色。在戰斗開始時,敵人擁有HP格血量。當血量小于等于0時,敵人死去。一個缺乏經驗的玩家可能簡單地嘗試每個回合都攻擊。但是你知道輔助技能的重要性。 在你的每個回合開始時你可以選擇以下兩個動作之一:聚力或者攻擊。聚力會提高你下個回合攻擊的傷害。攻擊會對敵人造成一定量的傷害。如果你上個回合使用了聚力,那這次攻擊會對敵人造成buffedAttack點傷害。否則,會造成normalAttack點傷害。 給出血量HP和不同攻擊的傷害,buffedAttack和normalAttack,返回你能殺死敵人的最小回合數。輸入描述:
第一行是一個數字HP 第二行是一個數字normalAttack 第三行是一個數字buffedAttack 1 <= HP,buffedAttack,normalAttack <= 10^9輸出描述:
輸出一個數字表示最小回合數示例1
輸入
13 3 5輸出
5 import java.io.*; public class Main {public static int res = 0;public static void main(String[] args) throws IOException {BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));int hp = Integer.parseInt(bf.readLine());int na = Integer.parseInt(bf.readLine());int ba = Integer.parseInt(bf.readLine());int r1 = hp / na + ((hp % na == 0) ? 0 : 1);int r2 = hp / ba * 2;if (hp % ba != 0) {if (hp % ba <= na) r2++;else r2 += 2;}System.out.println(Math.min(r1, r2));} }總結
以上是生活随笔為你收集整理的Java算法:牛客网拼多多笔试真题算法Java版1-13题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java项目:养老院管理系统(java+
- 下一篇: zabbix监控JAVA微服务_Zabb