华为od机试题9 真题
生活随笔
收集整理的這篇文章主要介紹了
华为od机试题9 真题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
華為od機試題 真題
- 9.尋找重復字符
- 7.字符串翻轉
- 6.小朋友身高排序
- 5.CPU最少執行時間
- 4.猴子爬山
- 3.輸出信元的值
- 2.指定元素對最小和
- 1.勾股數元組
以下題目附帶Java解法,是我個人寫的,不一定是標準答案,沒有真正的測試數據,只能說是我自己認為通過率100%,也不一定是最優解。如果有錯誤或是有更好的解法,請評論告訴我!!!
9.尋找重復字符
題目描述: 給定兩個字符串, 從字符串2中找出字符串1中的所有字符, 去重并按照ASCII碼值從小到大排列,輸入描述 字符范圍滿足ASCII編碼要求, 輸入字符串1長度不超過1024, 字符串2長度不超過100輸出描述 按照ASCII由小到大排序示例一 輸入 bach bbaaccddfg輸出 abc示例二 輸入 fach bbaaccedfg輸出 acf // 尋找重復字符public static void test009() {Scanner scanner = new Scanner(System.in);String line1 = scanner.nextLine();String line2 = scanner.nextLine();List<Character> list = new ArrayList<>();// 將輸入的字符串轉為字符數組for (int i = 0; i < line2.length(); i++) {list.add(line2.charAt(i));}// 用來存第一第二次輸入都有的字符List<Character> resList = new ArrayList<>();for (int i = 0; i < line1.length(); i++) {char c = line1.charAt(i);// &&后的條件是防止重復if (list.contains(c) && !resList.contains(c)) {resList.add(c);}}// 對集合進行排序,默認是按ASCII碼值排序Collections.sort(resList);for (Character c : resList) {System.out.print(c);}}7.字符串翻轉
輸入一個英文文章片段翻轉指定區間的單詞順序,標點符號和普通字母一樣處理例如輸入字符串 "I am a developer."區間[0,3]則輸出 "developer. a am I"輸入描述:使用換行隔開三個參數第一個參數為英文文章內容即英文字符串第二個參數為反轉起始單詞下標,下標從0開始第三個參數為結束單詞下標,輸出描述反轉后的英文文章片段,所有單詞之間以一個半角空格分割進行輸出示例一:輸入I am a developer.12輸出I a am developer.示例二:輸入Hello world!01輸出world! Hello說明:輸入字符串可以在前面或者后面包含多余的空格,但是反轉后的不能包含多余空格示例三:輸入:I am a developer.03輸出developer. a am I說明:如果兩個單詞見有多余的空格將反轉后單詞間的空格減少到只含一個示例四:輸入Hello!03輸出EMPTY說明:指定反轉區間只有一個單詞,或無有效單詞則統一輸出EMPTY // 字符串翻轉public static void test007() {Scanner sc = new Scanner(System.in);String line = sc.nextLine();int start = sc.nextInt();int end = sc.nextInt();// 去掉前后的空格line = line.trim();String[] split = line.split(" ");// 如果起始數小于0,取0start = Math.max(start, 0);// 如果結束數大于數組長度,取數組最后一個end = Math.min(end, split.length - 1);// 指定反轉區間只有一個單詞,或無有效單詞則統一輸出EMPTYif (start >= end || start >= split.length - 1 || end <= 0) {System.out.println("EMPTY");return;}// 進行字符串翻轉,直至重合while (start < end){String temp = split[start];split[start] = split[end];split[end] = temp;start++;end--;}//拼接字符串StringBuilder sb = new StringBuilder();for (String s : split) {sb.append(s + " ");}// 去掉末尾的空格System.out.println(sb.toString().trim());}6.小朋友身高排序
題目描述:小明今年升學到了小學一年級,來到新班級后,發現其他小朋友身高參差不齊,然后就想基于各小朋友和自己的身高差,對他們進行排序,請幫他實現排序輸入描述第一行為正整數 H和N0 < H < 200 為小明的身高0 < H < 50 為新班級其他小朋友個數第二行為N個正整數H1 ~ Hn分別是其他小朋友的身高取值范圍0 < Hi < 200且N個正整數各不相同輸出描述輸出排序結果,各正整數以空格分割和小明身高差絕對值最小的小朋友排在前面和小明身高差絕對值最大的小朋友排在后面如果兩個小朋友和小明身高差一樣則個子較小的小朋友排在前面示例一輸入100 1095 96 97 98 99 101 102 103 104 105輸出99 101 98 102 97 103 96 104 95 105 // 小朋友身高排序public static void test006() {Scanner sc = new Scanner(System.in);String line1 = sc.nextLine();String line2 = sc.nextLine();String[] input1 = line1.split(" ");String[] input2 = line2.split(" ");// 基準數int height = Integer.parseInt(input1[0]);// 人數int num = Integer.parseInt(input1[1]);List<Integer> list = new ArrayList<>();for (int i = 0; i < num; i++) {list.add(Integer.parseInt(input2[i]));}// list.sort() 自定義排序規則// 在 list.sort() 底層代碼中,以 compare(list [ i - 1 ], list [ i ]) 形式調用該方法,// 當其的返回值大于0時,list [ i - 1 ] 將與 list [ i ] 交換位置list.sort((h1, h2) -> {// 與基準數的絕對值int diff1 = Math.abs(h1 - height);int diff2 = Math.abs(h2 - height);// 若與基準數的絕對值相等,則高的排在后,否則基準數大的排在后return diff1 == diff2 ? h1 - h2 : diff1 - diff2;});for (Integer h : list) {System.out.print(h + " ");}}5.CPU最少執行時間
題目描述:為了充分發揮Gpu算力,需要盡可能多的將任務交給GPU執行,現在有一個任務數組,數組元素表示在這1s內新增的任務個數,且每秒都有新增任務,假設GPU最多一次執行n個任務,一次執行耗時1s,在保證Gpu不空閑的情況下,最少需要多長時間執行完成。輸入描述第一個參數為gpu最多執行的任務個數取值范圍1~10000第二個參數為任務數組的長度取值范圍1~10000第三個參數為任務數組數字范圍1~10000輸出描述執行完所有任務需要多少秒示例一輸入351 2 3 4 5輸出6說明一次最多執行3個任務,最少耗時6s示例二輸入455 4 1 1 1輸出5說明一次最多執行4個任務,最少耗時5s // CPU最少執行時間public static void test005() {Scanner sc = new Scanner(System.in);// 每秒執行任務數int qps = Integer.parseInt(sc.nextLine());int arrayLen = Integer.parseInt(sc.nextLine());String line = sc.nextLine();int[] array = new int[arrayLen];String[] strings = line.split(" ");for (int i = 0; i < arrayLen; i++) {array[i] = Integer.parseInt(strings[i]);}// 使用的時間int time = 0;// 剩余任務,初始為0int leaveTask = 0;for (int i = 0; i < arrayLen; i++) {// 若當前任務+剩余任務大于每秒執行任務,則剩余任務 = 之前剩余任務 + 當前任務 - 每秒執行任務if (array[i] + leaveTask > qps) {leaveTask = array[i] + leaveTask - qps;} else {leaveTask = 0;}// 累加時間time++;}// 當數組走完后還有剩余任務,用剩余任務/每秒執行任務算出需要的時間if (leaveTask > 0) {int res = leaveTask / qps;time = time + res;if (leaveTask % qps != 0) {time++;}}System.out.println(time);}4.猴子爬山
題目描述:一天一只頑猴想要從山腳爬到山頂途中經過一個有n個臺階的階梯,但是這個猴子有個習慣,每一次只跳1步或3步試問?猴子通過這個階梯有多少種不同的跳躍方式輸入描述輸入只有一個這個數n 0 < n < 50此階梯有多個臺階輸出描述有多少種跳躍方式示例一輸入50輸出122106097示例二輸入3COPY輸出2 /*** 解題思路:* 動態規劃題,找規律* n = 1 1* n = 2 1* n = 3 2* n = 4 3* n = 5 4* n = 6 6* n = 7 9* 可得當n > 3時 f(n) = f(n - 1) + f(n - 3)* 所以可以用遞歸,n = 1/2/3 時值是固定的,為遞歸結束條件*/// 猴子爬山public static void test004() {Scanner sc = new Scanner(System.in);int nums = sc.nextInt();int value = fun(nums);System.out.println(value);}private static int fun(int nums) {// 遞歸結束條件if (nums == 1 || nums == 2) {return 1;}// 遞歸結束條件if (nums == 3) {return 2;}// 規律return fun(nums - 1) + fun(nums - 3);}3.輸出信元的值
題目描述:TLV編碼是按TagLengthValue格式進行編碼的,一段碼流中的信元用tag標識,tag在碼流中唯一不重復,length表示信元value的長度,value表示信元的值,碼流以某信元的tag開頭,tag固定占一個字節,length固定占兩個字節,字節序為小端序,現給定tlv格式編碼的碼流以及需要解碼的信元tag,請輸出該信元的value。輸入碼流的16進制字符中,不包括小寫字母;且要求輸出的16進制字符串中也不要包含小寫字母;碼流字符串的最大長度不超過50000個字節。輸入描述第一行為第一個字符串 ,表示待解碼信元的tag;輸入第二行為一個字符串, 表示待解碼的16進制碼流;字節之間用空格分割。輸出描述輸出一個字符串,表示待解碼信元以16進制表示的value。示例一輸入3132 01 00 AE 90 02 00 01 02 30 03 00 AB 32 31 31 02 00 32 33 33 01 00 CC輸出32 33說明需要解析的信源的tag是31;從碼流的起始處開始匹配,tag為32的信元長度為1(01 00,小端序表示為1);第二個信元的tag為90 其長度為2;第三個信元的tag為30 其長度為3;第四個信元的tag為31 其長度為2(02 00);所以返回長度后面的兩個字節即可 為 32 33。 // 輸出信元的值public static void test003() {Scanner sc = new Scanner(System.in);String tag = sc.nextLine();String line = sc.nextLine();int len = line.length();int p = 0;while (p < len) {// value的長度 后兩位拼接前兩位,16進制,需要轉換為10進制int length = Integer.parseInt(line.substring(p + 6, p + 8) + line.substring(p + 3, p + 5), 16);// 找到目標值if (tag.equals(line.substring(p, p + 2))) {String value = line.substring(p + 9, p + 9 + (length * 3 - 1));System.out.println(value);return;}// 動態算出p應該移動幾位,tag和length是固定的,value根據length決定,要注意空格p += 9 + length * 3;}}2.指定元素對最小和
題目描述:給定兩個整數數組,arr1、arr2,數組元素按升序排列;假設從arr1、arr2中分別取出一個元素,可構成一對元素;現在需要取出k對元素,并對取出的所有元素求和,計算和的最小值;注意:兩對元素對應arr1、arr2的下標是相同的,視為同一對元素。輸入描述輸入兩行數組arr1、arr2每行首個數字為數組大小size, 0 < size <= 100arr1,arr2中的每個元素e, 0< e <1000接下來一行,正整數k 0 < k <= arr1.size * arr2.size輸出描述滿足要求的最小值示例一輸入1 1 21 2 32輸出4說明:用例中需要取兩個元素,取第一個數組第0個元素與第二個數組第0個元素組成一個元素[1,1];取第一個數組第1個元素與第二個數組第0個元素組成一個元素[1,1];求和為1+1+1+1=4 ,滿足要求最小 // 指定元素對最小和// 思路:雙層for循環,求出兩個數組所有值一一相加的值,放進另一個數組中,并進行升序排序,求出指定前幾個的和public static void test002() {Scanner sc = new Scanner(System.in);String line1 = sc.nextLine();String line2 = sc.nextLine();int[] array1 = stringToArray(line1);int[] array2 = stringToArray(line2);int len1 = array1.length;int len2 = array2.length;int groupCount = sc.nextInt();List<Integer> list = new ArrayList();// 雙層for循環,求出兩個數組所有值一一相加的值,放進另一個數組中for (int i = 0; i < len1; i++) {for (int j = 0; j < len2; j++) {list.add(array1[i] + array2[j]);}}// 對集合進行排序(升序)Collections.sort(list);int res = 0;// 求出指定前幾個的和for (int i = 0; i < groupCount; i++) {res += list.get(i);}System.out.println(res);}private static int[] stringToArray(String line) {String[] strings = line.split(" ");int[] array = new int[strings.length];for (int i = 0; i < strings.length; i++) {array[i] = Integer.parseInt(strings[i]);}return array;}1.勾股數元組
題目描述:如果三個正整數A、B、C ,A2+B2=C2則為勾股數如果ABC之間兩兩互質,即A與B,A與C,B與C均互質沒有公約數,則稱其為勾股數元組。請求出給定n~m范圍內所有的勾股數元組輸入描述起始范圍1 < n < 10000n < m < 10000輸出描述ABC保證A<B<C輸出格式A B C多組勾股數元組,按照A B C升序的排序方式輸出。若給定范圍內,找不到勾股數元組時,輸出Na。示例一輸入120輸出3 4 55 12 138 15 17示例二輸入510輸出Na // 解題思路:雙層for循環,求出所有勾股數元組,在篩選出符合條件的// 勾股數元組public static void test001() {Scanner sc = new Scanner(System.in);int num1 = sc.nextInt();int num2 = sc.nextInt();boolean flag = true;for (int i = num1; i < num2; i++) {for (int j = i + 1; j <= num2; j++) {// pow():取幾次方,0.5次方相當于開根號double res = Math.pow(i, 2) + Math.pow(j, 2);double pow = Math.pow(res, 0.5);// 結果小于nums且是整數 判斷一個double型數據是不是整數:Math.abs(pow - Math.round(pow)) < Double.MIN_VALUEif (pow <= num2 && Math.abs(pow - Math.round(pow)) < Double.MIN_VALUE) {int powRes = (int) pow;// 兩兩互質if (isSingle(i, j) && isSingle(i, powRes) && isSingle(j, powRes)) {System.out.println(i + " " + j + " " + powRes);flag = false;}}}}if (flag) {System.out.println("Na");}}/*** 判斷兩個數字是否互質 (沒有相同的公約數)** @param num1* @param num2* @return*/private static boolean isSingle(int num1, int num2) {int res = Math.min(num1, num2);for (int i = 2; i <= res; i++) {if (num1 % i == 0 && num2 % i == 0) {return false;}}return true;}總結
以上是生活随笔為你收集整理的华为od机试题9 真题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: rdlc和rdl的区别
- 下一篇: 4.4OC10-内存管理2-set方法的