华为od机试题4 真题
生活随笔
收集整理的這篇文章主要介紹了
华为od机试题4 真题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
華為od機試題 真題
- 58.處理所有作業總時長
- 53.最大停車距離
- 52.磁盤容量排序
- 51.非嚴格遞增連續數字序列長度
- 50.均分糖果
- 48.沒有相同字符的元素長度乘積的最大值
- 47. 相對開音節結構的子串個數
- 46.火星人公式求值
以下題目附帶Java解法,是我個人寫的,不一定是標準答案,沒有真正的測試數據,只能說是我自己認為通過率100%,也不一定是最優解。如果有錯誤或是有更好的解法,請評論告訴我!!!
58.處理所有作業總時長
一個工廠有m條流水線來并行完成n個獨立的作業該工廠設置了一個調度系統在安排作業時,總是優先執行處理時間最短的作業現給定流水線個數m需要完成的作業數n每個作業的處理時間分別為 t1,t2...tn請你編程計算處理完所有作業的耗時為多少當n>m時 首先處理時間短的m個作業進入流水線其他的等待當某個作業完成時,依次從剩余作業中取處理時間最短的進入處理輸入描述:第一行為兩個整數(采取空格分隔)分別表示流水線個數m和作業數n第二行輸入n個整數(采取空格分隔)表示每個作業的處理時長 t1,t2...tn0<m,n<1000<t1,t2...tn<100輸出描述輸出處理完所有作業的總時長案例輸入3 58 4 3 2 10輸出13說明先安排時間為2,3,4的三個作業第一條流水線先完成作業調度剩余時間最短的作業8第二條流水線完成作業調度剩余時間最短的作業10總共耗時 就是二條流水線完成作業時間13(3+10)輸入3 91 1 1 2 3 4 6 7 8輸出13 // 處理所有作業的總時長// 解題思路:對數組進行排序,累加每條流水線分配的任務的時長,輸出最大的public static void test058() {Scanner sc = new Scanner(System.in);String line1 = sc.nextLine();String line2 = sc.nextLine();String[] split1 = line1.split(" ");// 流水線個數m和作業數nint m = Integer.parseInt(split1[0]);int n = Integer.parseInt(split1[1]);String[] split2 = line2.split(" ");List<Integer> list = new ArrayList<>();for (int i = 0; i < split2.length; i++) {list.add(Integer.parseInt(split2[i]));}// 對數組進行排序Collections.sort(list);// 作業數n小于等于流水線個數m,則結果為排序后的最后一個值if (n <= m) {System.out.println(list.get(list.size() - 1));return;}// 結果int res = 0;// 遍歷每一條流水線for (int k = 0; k < m; k++) {// 每條流水線獲取到的任務時長總和int allTime = 0;// 累加每條流水線獲取到的任務時長for (int i = k; i < list.size(); i += m) {allTime += list.get(i);}// 取最大的res = Math.max(allTime, res);}System.out.println(res);}53.最大停車距離
停車場有一橫排車位0代表沒有停車,1代表有車.至少停了一輛車在車位上,也至少有一個空位沒有停車.為防止刮蹭,需為停車人找到一個車位使得停車人的車最近的車輛的距離是最大的返回此時的最大距離輸入描述:1. 一個用半角逗號分割的停車標識字符串,停車標識為0或1,0為空位,1為已停車2. 停車位最多有100個輸出描述1. 輸出一個整數記錄最大距離示例一:輸入1,0,0,0,0,1,0,0,1,0,1輸出2說明當車停在第三個位置上時,離其最近的車距離為2(1~3)當車停在第四個位置上時,離其最近的車距離為2(4~6)其他位置距離為1因此最大距離為2 // 最大停車距離// 解題思路:取出所有已停車的位置的索引,計算其與停車場頭的距離、停車場尾的距離、兩車之間的距離/2,輸出最大的值public static void test053(){Scanner sc = new Scanner(System.in);String line = sc.nextLine();String[] split = line.split(",");// 存放停車位置的索引List<Integer> list = new ArrayList<>();for (int i = 0; i < split.length; i++) {int num = Integer.parseInt(split[i]);if (1 == num) {list.add(i);}}// 第一輛車與停車場頭的距離int startLen = list.get(0);// 最后一輛車與停車場尾的距離int endLen = split.length - 1 - list.get(list.size() - 1);int res = 0;for (int i = 0; i < list.size() - 1; i++) {// 停車后與左右車的最小距離int len = (list.get(i + 1) - list.get(i)) / 2;res = Math.max(res, len);}// 最大距離System.out.println(Math.max(res,Math.max(startLen, endLen)));}52.磁盤容量排序
磁盤的容量單位有M,G,T這三個等級他們之間的換算關系為1T=1024G1G=1024M現在給定N塊磁盤的容量請對他們按從小到大的順序進行穩定排序例如給定5塊盤容量1T,20M,3G,10G6T,3M12G9M排序后的結果為20M,3G,3M12G9M,1T,10G6T注意單位可以重復出現上述3M12G9M為 3M+12G+9M和 12M12G相等輸入描述:輸入第一行包含一個整數N2<=N<=100 ,表示磁盤的個數接下來的N行每行一個字符串 長度 (2<l<30)表示磁盤的容量有一個或多個格式為 mv的子串組成其中m表示容量大小 v表示容量單位例如磁盤容量m的范圍 1~1024正整數容量單位v的范圍包含題目中提到的M,G,T輸出描述:輸出N行表示N塊磁盤容量排序后的結果示例1:輸入31G2G1024M輸出1G1024M2G說明 1G和1024M容量相等,穩定排序要求保留他們原來的相對位置故1G在1024M前示例二:輸入32G4M3M2G1T輸出3M2G2G4M1T說明1T大于2G4M大于3M2G // 磁盤容量排序// 解題思路:將輸入的值放在集合中,將每個元素都轉換為M為單位,在進行比較排序public static void test052_2() {Scanner sc = new Scanner(System.in);int len = Integer.parseInt(sc.nextLine());List<String> list = new ArrayList<>();for (int i = 0; i < len; i++) {list.add(sc.nextLine());}list.sort((s1, s2) -> {// 復雜的寫法,使用雙層循環分別求出每個數字和字母char[] chars1 = s1.toCharArray();char[] chars2 = s2.toCharArray();// 使用long型防止int型不夠用long allNum1 = 0;long allNum2 = 0;for (int i = 0; i < chars1.length; i++) {String num = "";// 判斷是否是數字->獲得字母前的數字while (i < chars1.length && Character.isDigit(chars1[i])) {// 拼接數字num = num + chars1[i];i++;}if (chars1[i] == 'M') {allNum1 += Integer.parseInt(num);} else if (chars1[i] == 'G') {allNum1 += Integer.parseInt(num) * 1024;} else {allNum1 += Integer.parseInt(num) * 1024 * 1024;}}for (int i = 0; i < chars2.length; i++) {String num = "";// 判斷是否是數字->獲得字母前的數字while (i < chars2.length && Character.isDigit(chars2[i])) {// 拼接數字num = num + chars2[i];i++;}if (chars2[i] == 'M') {allNum2 += Integer.parseInt(num);} else if (chars2[i] == 'G') {allNum2 += Integer.parseInt(num) * 1024;} else {allNum2 += Integer.parseInt(num) * 1024 * 1024;}}// 比較兩個long型數據,x > y 返回1,x < y返回-1,x = y返回0return Long.compare(allNum1, allNum2);});for (String s : list) {System.out.println(s);}}// 巧妙的解法public static void test052() {Scanner sc = new Scanner(System.in);int len = Integer.parseInt(sc.nextLine());List<String> list = new ArrayList<>();for (int i = 0; i < len; i++) {list.add(sc.nextLine());}// 對數組進行排序list.sort((s1, s2) -> {long num1 = toNumber(s1);long num2 = toNumber(s2);// 比較兩個long型數據,x > y 返回1,x < y返回-1,x = y返回0return Long.compare(num1, num2);});for (String s : list) {System.out.println(s);}}/*** 將字符串轉為具體多少M,返回一個long型數字** @return*/private static long toNumber(String s) {// 正則表達式:根據字母M或G或T進行分割String[] numArray = s.split("[M|G|T]"); // 結果[1,2,3]// 正則表達式:根據1個或多個數字進行分割String[] letterArray = s.split("[0-9]+"); // 結果[,M,T,G] 因為字符串以數字開頭,所以數組第一個是空// 返回的結果long sum = 0;for (int i = 1; i < letterArray.length; i++) {String letter = letterArray[i];long num = Long.parseLong(numArray[i - 1]);if ("M".equals(letter)) {sum += num;} else if ("G".equals(letter)) {sum += 1024 * num;} else if ("T".equals(letter)) {sum += 1024 * 1024 * num;}}return sum;}51.非嚴格遞增連續數字序列長度
輸入一個字符串僅包含大小寫字母和數字求字符串中包含的最長的非嚴格遞增連續數字序列長度比如:12234屬于非嚴格遞增數字序列示例:輸入abc2234019A334bc輸出4說明:2234為最長的非嚴格遞增連續數字序列,所以長度為4輸入aaaaaa44ko543j123j7345677781輸出8輸入aaaaa34567778a44ko543j123j71輸出8輸入345678a44ko543j123j7134567778aa輸出9輸入fwefksoSKJF12S45DS3DSAJKSldsf565441345sd1f87151234657812154341543輸出5 // 非嚴格遞增連續數字序列長度// 解題思路:遍歷每一個字符,按照規則計算非嚴格遞增連續數字序列長度,保留最大長度public static void test051() {Scanner sc = new Scanner(System.in);String line = sc.nextLine();char[] chars = line.toCharArray();// 當前非嚴格遞增長度int currentLen = 0;// 非嚴格遞增最大長度int maxLen = 0;// 上一個字符,默認一個比數字大的char last = 'a';for (char c : chars) {if (Character.isDigit(c)) { // 當前字符是數字if (currentLen == 0) { // 當數字是開頭時currentLen++;} else if (c >= last) { // 符合非嚴格遞增,當前非嚴格遞增長度長度currentLen++;} else { // 不符合非嚴格遞增,保留最大的非嚴格遞增長度maxLen = Math.max(currentLen, maxLen);// 初始化當前嚴格遞增長度,因為當前是數字,所以其本身長度是1currentLen = 1;}// 將當前數字置為上一個,用于比較last = c;} else { // 當前字符不是數字// 保留最大的非嚴格遞增長度maxLen = Math.max(maxLen, currentLen);// 初始化當前嚴格遞增長度currentLen = 0;}}System.out.println(maxLen);}50.均分糖果
小明從糖果盒中隨意抓一把糖果每次小明會取出一半的糖果分給同學們當糖果不能平均分配時小明可以從糖果盒中(假設盒中糖果足夠)取出一個或放回一個糖果小明至少需要多少次(取出放回和平均分配均記一次)能將手中糖果分至只剩一顆輸入描述:抓取糖果數(小于1000000):15輸出描述:最少分至一顆糖果的次數:5示例1:輸入15輸出5備注解釋:(1) 15+1=16;(2) 16/2=8;(3) 8/2=4;(4) 4/2=2;(5) 2/2=1; // 這道題通過率好像只有85%,我也不知道原因// 均分糖果// 解題思路:當糖果數n不是偶數時,當(n + 1) / 2 % 2 == 0 說明num+1后除以2還是偶數,所以選擇n+1,否則n-1public static void test050() {Scanner sc = new Scanner(System.in);int num = sc.nextInt();int count = 0;while (num != 1) {// 當num=3時,不符合一下規則,但是很容易算出是2次,所以直接加2并結束if (num == 3) {System.out.println(count + 2);return;}// 當num不是偶數if (num % 2 != 0) {// 當(num + 1) / 2 % 2 == 0 說明num+1后除以2還是偶數,所以選擇+1,否則-1if ((num + 1) / 2 % 2 == 0) {num++;} else {num--;}// 無論是+1還是-1,count都要累加1count++;} else { // 當nums是偶數,除以2,count累加1num /= 2;count++;}}System.out.println(count);}48.沒有相同字符的元素長度乘積的最大值
給定一個元素類型為小寫字符串的數組請計算兩個沒有相同字符的元素長度乘積的最大值如果沒有符合條件的兩個元素返回0輸入描述輸入為一個半角逗號分割的小寫字符串數組2<= 數組長度 <=1000< 字符串長度 <=50輸出描述兩個沒有相同字符的元素長度乘積的最大值示例一輸入iwdvpbn,hk,iuop,iikd,kadgpf輸出14說明數組中有5個元組 第一個和第二個元素沒有相同字符滿足條件 輸出7*2=14 // 沒有相同字符的元素長度乘積的最大值// 解題思路:一一比對元素,看一個元素是否包含另一個元素,如果沒有則保留這兩個元素的長度的乘積,保留最大的public static void test048() {Scanner sc = new Scanner(System.in);String line = sc.nextLine();String[] split = line.split(",");int sum = 0;for (int i = 0; i < split.length; i++) {for (int j = i + 1; j < split.length; j++) {// 兩個元素有沒有相同字符標識位boolean flag = true;String first = split[i];String next = split[j];// 遍歷一個元素的全部字符for (int k = 0; k < first.length(); k++) {// 判斷是否包含這些字符if (next.contains(first.charAt(k) + "")) {// 有相同的字符flag = false;break;}}// 沒有相同的字符if (flag) {// 計算兩個元素長度的乘積,保留最大的sum = Math.max(sum, first.length() * next.length());}}}System.out.println(sum);}47. 相對開音節結構的子串個數
相對開音節構成的結構為輔音+元音(aeiou)+輔音(r除外)+e常見的單詞有bike cake給定一個字符串,以空格為分隔符反轉每個單詞的字母若單詞中包含如數字等其他非字母時不進行反轉反轉后計算其中含有相對開音節結構的子串個數(連續子串中部分字符可以重復)輸入描述字符串 以空格分割的多個單詞長度<10000 字母只考慮小寫輸出描述含有相對開音節結構的子串個數示例1:輸入ekam a ekac輸出2說明:反轉后為 make a cake 其中make和cake為相對開音節子串返回2示例2:輸入!ekam a ekekac輸出2說明反轉后為 !ekam a cakeke因為!ekam含有非英文字母,所以未反轉其中 cake和keke 為相對開音節子串 返回2 // 疑問:不進行反轉的單詞要不要算相對開音節子串?我這里是算的,如果不算的話,則將反轉后的單詞單獨放到集合里,在進行處理// 相對開音節結構的子串個數// 解題思路:遍歷所有單詞,根據條件進行反轉,反轉后在計算相對開音節結構的子串個數public static void test047() {Scanner sc = new Scanner(System.in);String line = sc.nextLine();String[] split = line.split(" ");// 相對開音節結構的子串個數int count = 0;for (int i = 0; i < split.length; i++) {String str = split[i];// 若單詞中包含如數字等其他非字母時不進行反轉if (str.replaceAll("[a-z]", "").length() == 0) {String newStr = "";for (int j = 0; j < str.length(); j++) {newStr = str.charAt(j) + newStr;}str = newStr;}// 計算相對開音節結構的子串個數for (int k = 0; k < str.length() - 3; k++) {// 輔音+元音(aeiou)+輔音(r除外)+eif (!"aeiou".contains(str.charAt(k) + "")&& "aeiou".contains(str.charAt(k + 1) + "")&& !"aeiour".contains(str.charAt(k + 2) + "")&& 'e' == str.charAt(k + 3)) {count++;}}}System.out.println(count);}46.火星人公式求值
已知火星人使用的運算符號為#;$其與地球人的等價公式如下x#y=2*x+3*y+4x$y=3*x+y+2x y是無符號整數地球人公式按照c語言規則進行計算火星人公式中$符優先級高于# 相同的運算符按從左到右的順序運算輸入描述:火星人字符串表達式結尾不帶回車換行輸入的字符串說明是 字符串為僅有無符號整數和操作符組成的計算表達式1.用例保證字符串中操作數與操作符之間沒有任何分隔符2.用例保證操作數取值范圍為32位無符號整數,3.保證輸入以及計算結果不會出現整型溢出4.保證輸入的字符串為合法的求值報文例如: 123#4$5#76$785.保證不會出現非法的求值報文例如: #4$5 這種缺少操作數4$5# 這種缺少操作數4#$5 這種缺少操作數4 $5 有空格3+4-5*6/7 有其他操作符12345678987654321$54321 32位整數溢出輸出描述:根據火星人字符串輸出計算結果結尾不帶回車換行案例1:輸入:7#6$5#12輸出:226說明 示例7#6$5#12=7#(3*6+5+2)#12=7#25#12=(2*7+3*25+4)#12=93#12=2*93+3*12+4=226 // 火星人公式求值// 解題思路:根據數字、#$ 將字符串分割成兩個數組,先計算$,在計算#public static void test046() {Scanner sc = new Scanner(System.in);String line = sc.nextLine();String[] sign = line.split("[0-9]+"); // { ,#,$,$}List<String> signList = new ArrayList<>();// 數字前面是空串,所以從1開始for (int i = 1; i < sign.length; i++) {signList.add(sign[i]);}String[] nums = line.split("[$|#]+"); // {1,2,23,34}List<Integer> numsList = new ArrayList();for (int i = 0; i < nums.length; i++) {numsList.add(Integer.parseInt(nums[i]));}// 找出所有的$while (signList.indexOf("$") != -1) {int index$ = signList.indexOf("$");// 計算$表達式int sum = calculation$(numsList.get(index$), numsList.get(index$ + 1));// 替換 $前后的數字 為 $表達式的值 numsList.set(index$, sum);numsList.remove(index$ + 1);// 移除$符號signList.remove(index$);}// 計算#表達式的值int res = numsList.get(0);for (int i = 1; i < numsList.size(); i++) {res = calculation(res, numsList.get(i));}System.out.println(res);}/*** x$y=3*x+y+2* @param num1* @param num2* @return*/private static int calculation$(int num1, int num2) {return 3 * num1 + num2 + 2;}/*** x#y=2*x+3*y+4* @param num1* @param num2* @return*/private static int calculation(int num1, int num2) {return 2 * num1 + 3 * num2 + 4;}更多華為od機試題請點這里<華為od機試題5 真題>,每篇8題,有更多的題也請告訴我啊
總結
以上是生活随笔為你收集整理的华为od机试题4 真题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sqlserver加载驱动失败的问题
- 下一篇: 无法将类 XXX中的构造器 XXX应用到