华为od机试题6 真题
生活随笔
收集整理的這篇文章主要介紹了
华为od机试题6 真题
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
華為od機(jī)試題 真題
- 35.輸出滿足條件的數(shù)對
- 34.尋找眾數(shù)中的中位數(shù)
- 33.分配內(nèi)存
- 32.窗口和的最大值
- 31.求整數(shù)的連續(xù)自然數(shù)之和的表達(dá)式
- 30.矩陣的最大值
以下題目附帶Java解法,是我個人寫的,不一定是標(biāo)準(zhǔn)答案,沒有真正的測試數(shù)據(jù),只能說是我自己認(rèn)為通過率100%,也不一定是最優(yōu)解。如果有錯誤或是有更好的解法,請評論告訴我!!!
35.輸出滿足條件的數(shù)對
同一個數(shù)軸x有兩個點的集合A={A1,A2,...,Am}和B={B1,B2,...,Bm}A(i)和B(j)均為正整數(shù)A、B已經(jīng)按照從小到大排好序,AB均不為空給定一個距離R 正整數(shù),列出同時滿足如下條件的(A(i),B(j))數(shù)對1. A(i)<=B(j)2. A(i),B(j)之間距離小于等于R3. 在滿足1,2的情況下每個A(i)只需輸出距離最近的B(j)4. 輸出結(jié)果按A(i)從小到大排序輸入描述第一行三個正整數(shù)m n R第二行m個正整數(shù) 表示集合A第三行n個正整數(shù) 表示集合B輸入限制 1<=R<=1000001<=n,m<=1000001<= A(i),B(j) <= 1000000000輸出描述每組數(shù)對輸出一行 A(i)和B(j)以空格隔開示例一輸入4 5 51 5 5 101 3 8 8 20輸出1 15 85 8 // 輸出滿足條件的數(shù)對// 解題思路:雙層for循環(huán),依次遍歷2個數(shù)組,找出滿足條件的數(shù)對// 這題沒說B數(shù)組中的數(shù)只能用一次,所以解法應(yīng)該沒問題public static void test035() {Scanner sc = new Scanner(System.in);String[] split = sc.nextLine().split(" ");String[] a = sc.nextLine().split(" ");String[] b = sc.nextLine().split(" ");int aLen = Integer.parseInt(split[0]);int bLen = Integer.parseInt(split[1]);int r = Integer.parseInt(split[2]);// 遍歷數(shù)組Afor (int i = 0; i < aLen; i++) {// 遍歷數(shù)組Bfor (int j = 0; j < bLen; j++) {int numI = Integer.parseInt(a[i]);int numJ = Integer.parseInt(b[j]);if (numI <= numJ && (numJ - numI <= r)) {System.out.println(numI + " " + numJ);break;}}}}34.尋找眾數(shù)中的中位數(shù)
1.眾數(shù)是指一組數(shù)據(jù)中出現(xiàn)次數(shù)多的數(shù)眾數(shù)可以是多個2.中位數(shù)是指把一組數(shù)據(jù)從小到大排列,最中間的那個數(shù),如果這組數(shù)據(jù)的個數(shù)是奇數(shù),那最中間那個就是中位數(shù)如果這組數(shù)據(jù)的個數(shù)為偶數(shù),那就把中間的兩個數(shù)之和除以2就是中位數(shù)3.查找整型數(shù)組中元素的眾數(shù)并組成一個新的數(shù)組求新數(shù)組的中位數(shù)輸入描述輸入一個一維整型數(shù)組,數(shù)組大小取值范圍 0<n<1000數(shù)組中每個元素取值范圍, 0<e<1000輸出描述輸出眾數(shù)組成的新數(shù)組的中位數(shù)示例一輸入:10 11 21 19 21 17 21 16 21 18 16輸出21示例二輸入2 1 5 4 3 3 9 2 7 4 6 2 15 4 2 4輸出3示例三輸入5 1 5 3 5 2 5 5 7 6 7 3 7 11 7 55 7 9 98 9 17 9 15 9 9 1 39輸出7 // 尋找眾數(shù)中的中位數(shù)// 解題思路:遍歷輸入的數(shù)組,用一個map存儲各個數(shù)組以及出現(xiàn)的次數(shù),找出出現(xiàn)次數(shù)最多的數(shù)存在一個集合中,對集合進(jìn)行排序,獲取中位數(shù)public static void test034() {Scanner sc = new Scanner(System.in);String[] split = sc.nextLine().split(" ");// key:數(shù)字 value:出現(xiàn)次數(shù)Map<Integer, Integer> map = new HashMap<>();for (int i = 0; i < split.length; i++) {int num = Integer.parseInt(split[i]);if (map.containsKey(num)) {map.put(num, map.get(num) + 1);} else {map.put(num, 1);}}// 最大的出現(xiàn)次數(shù)int count = 0;for (Integer m : map.keySet()) {// 獲取最大的出現(xiàn)次數(shù)count = Math.max(count, map.get(m));}// 存儲眾數(shù)List<Integer> list = new ArrayList<>();// 獲取眾數(shù)for (Integer m : map.keySet()) {if (map.get(m) >= count) {list.add(m);}}// 對數(shù)組進(jìn)行排序Collections.sort(list);int size = list.size();// 獲取中位數(shù)if (size % 2 == 0) {System.out.println((list.get(size / 2 - 1) + list.get(size / 2)) / 2);} else {System.out.println(list.get(size / 2));}}33.分配內(nèi)存
有一個簡易內(nèi)存池,內(nèi)存按照大小粒度分類每個粒度有若干個可用內(nèi)存資源用戶會進(jìn)行一系列內(nèi)存申請需要按需分配內(nèi)存池中的資源返回申請結(jié)果成功失敗列表分配規(guī)則如下1.分配的內(nèi)存要大于等于內(nèi)存的申請量存在滿足需求的內(nèi)存就必須分配優(yōu)先分配粒度小的,但內(nèi)存不能拆分使用2.需要按申請順序分配先申請的先分配,有可用內(nèi)存分配則申請結(jié)果為true沒有可用則返回false注釋:不考慮內(nèi)存釋放輸入描述輸入為兩行字符串第一行為內(nèi)存池資源列表包含內(nèi)存粒度數(shù)據(jù)信息,粒度數(shù)據(jù)間用逗號分割一個粒度信息內(nèi)用冒號分割冒號前為內(nèi)存粒度大小,冒號后為數(shù)量資源列表不大于1024每個粒度的數(shù)量不大于4096第二行為申請列表申請的內(nèi)存大小間用逗號分割,申請列表不大于100000如64:2,128:1,32:4,1:12850,36,64,128,127輸出描述輸出為內(nèi)存池分配結(jié)果如true,true,true,false,false示例一:輸入:64:2,128:1,32:4,1:12850,36,64,128,127輸出:true,true,true,false,false說明:內(nèi)存池資源包含:64k共2個、128k共1個、32k共4個、1k共128個的內(nèi)存資源針對50,36,64,128,127的內(nèi)存申請序列,分配的內(nèi)存依次是,64,64,128,null,null第三次申請內(nèi)存時已經(jīng)將128分配出去,因此輸出的結(jié)果是true,true,true,false,false // 分配內(nèi)存// 解題思路:用一個有序的Map存儲內(nèi)存、內(nèi)存數(shù)量,遍歷需要分配的內(nèi)存,在Map中找是否有滿足要求的public static void test033() {Scanner sc = new Scanner(System.in);String[] split1 = sc.nextLine().split(",");String[] split2 = sc.nextLine().split(",");// treeMap是有序的,按照key降序排序,hashMap是無序的。key:內(nèi)存大小,value:數(shù)量Map<Integer, Integer> map = new TreeMap<>();for (int i = 0; i < split1.length; i++) {String[] split = split1[i].split(":");int num = Integer.parseInt(split[0]);int count = Integer.parseInt(split[1]);map.put(num, count);}// 拼接結(jié)果StringBuilder sb = new StringBuilder();// 遍歷需要分配的內(nèi)存for (int i = 0; i < split2.length; i++) {// 標(biāo)志位,用來判斷輸入true/falseboolean flag = true;// 遍歷mapfor (Integer m : map.keySet()) {int key = Integer.parseInt(split2[i]);// 是否滿足條件if (m > key && map.get(m) >= 1) {sb.append("true,");// 數(shù)量減1map.put(m, map.get(m) - 1);flag = false;break;}}// 沒有滿足條件的,輸出falseif (flag) {sb.append("false,");}}System.out.println(sb.toString().substring(0, sb.length() - 1));}32.窗口和的最大值
有一個N個整數(shù)的數(shù)組和一個長度為M的窗口窗口從數(shù)組內(nèi)的第一個數(shù)開始滑動直到窗口不能滑動為止每次滑動產(chǎn)生一個窗口 和窗口內(nèi)所有數(shù)的和求窗口滑動產(chǎn)生的所有窗口和的最大值輸入描述第一行輸入一個正整數(shù)N表示整數(shù)個數(shù) 0<N<100000第二行輸入N個整數(shù)整數(shù)取值范圍 [-100,100]第三行輸入正整數(shù)MM代表窗口的大小M<=100000 并<=N輸出描述窗口滑動產(chǎn)生所有窗口和的最大值示例一輸入612 10 20 30 15 233輸出68 // 窗口和的最大值// 解題思路:遍歷數(shù)組,求出所有窗口數(shù)的和,取最大值public static void test032() {Scanner sc = new Scanner(System.in);int len = Integer.parseInt(sc.nextLine());String[] split = sc.nextLine().split(" ");int num = Integer.parseInt(sc.nextLine());int res = 0;// 遍歷數(shù)組for (int i = 0; i <= len - num; i++) {int sum = 0;for (int j = 0; j < num; j++) {// 窗口所有數(shù)之和sum = sum + Integer.parseInt(split[i + j]);}// 取最大值res = Math.max(res, sum);}System.out.println(res);}31.求整數(shù)的連續(xù)自然數(shù)之和的表達(dá)式
一個整數(shù)可以由連續(xù)的自然數(shù)之和來表示給定一個整數(shù)計算該整數(shù)有幾種連續(xù)自然數(shù)之和的表達(dá)式并打印出每一種表達(dá)式輸入描述一個目標(biāo)整數(shù)t 1<= t <=1000輸出描述1.該整數(shù)的所有表達(dá)式和表達(dá)式的個數(shù)如果有多種表達(dá)式,自然數(shù)個數(shù)最少的表達(dá)式優(yōu)先輸出2.每個表達(dá)式中按自然數(shù)遞增輸出具體的格式參見樣例在每個測試數(shù)據(jù)結(jié)束時,輸出一行"Result:X"其中X是最終的表達(dá)式個數(shù)輸入9輸出9=99=4+59=2+3+4Result:3說明 整數(shù)9有三種表達(dá)方法:示例二輸入10輸出10=1010=1+2+3+4Result:2 // 求整數(shù)的連續(xù)自然數(shù)之和的表達(dá)式// 解題思路:雙層for循環(huán),外層從1開始遍歷到目標(biāo)數(shù)的一半,內(nèi)層按順序累加值,滿足條件則結(jié)束內(nèi)循環(huán)public static void test031() {Scanner sc = new Scanner(System.in);int num = sc.nextInt();// 10=10 這種是每個數(shù)都有的,先輸出System.out.println(num + "=" + num);// 存放結(jié)果List<String> list = new ArrayList<>();for (int i = 1; i <= num / 2; i++) {int sum = 0;StringBuilder sb = new StringBuilder();for (int j = i; j <= num; j++) {// 累加值sum += j;sb = sb.append(j).append("+");if (sum == num) {// 存放結(jié)果list.add(num + "=" + sb.substring(0, sb.length() - 1));break;} else if (sum > num) {break;}}}// 從短到長,所以反過來遍歷for (int i = list.size() - 1; i >= 0; i--) {System.out.println(list.get(i));}System.out.println("Result:" + (list.size() + 1));}30.矩陣的最大值
給定一個僅包含0和1的n*n二維矩陣請計算二維矩陣的最大值計算規(guī)則如下1、每行元素按下標(biāo)順序組成一個二進(jìn)制數(shù)(下標(biāo)越大約排在低位),二進(jìn)制數(shù)的值就是該行的值,矩陣各行之和為矩陣的值2、允許通過向左或向右整體循環(huán)移動每個元素來改變元素在行中的位置比如[1,0,1,1,1] 向右整體循環(huán)移動兩位 [1,1,1,0,1]二進(jìn)制數(shù)為11101 值為29[1,0,1,1,1] 向左整體循環(huán)移動兩位 [1,1,1,1,0]二進(jìn)制數(shù)為11110 值為30輸入描述1.數(shù)據(jù)的第一行為正整數(shù),記錄了N的大小0<N<=202.輸入的第2到n+1行為二維矩陣信息行內(nèi)元素邊角逗號分割輸出描述矩陣的最大值示例1輸入51,0,0,0,1 240,0,0,1,1 240,1,0,1,0 201,0,0,1,1 281,0,1,0,1 26輸出122說明第一行向右整體循環(huán)移動一位,得到最大值 11000 24因此最大122 // 矩陣的最大值// 解題思路:矩陣的每一行依次變換位置,保留其最大值,然后將其最大值相加public static void test030() {Scanner sc = new Scanner(System.in);int num = Integer.parseInt(sc.nextLine());List<String> list = new ArrayList<>();// 將輸入的矩陣放進(jìn)list中for (int i = 0; i < num; i++) {list.add(sc.nextLine());}// 結(jié)果int res = 0;for (int i = 0; i < list.size(); i++) {String str = list.get(i).replaceAll(",", "");// 矩陣每行的最大值int sum = 0;// 依次變換矩陣的位置,每次換一位for (int j = 0; j < num; j++) {sum = Math.max(sum, Integer.parseInt(str, 2));str = str.substring(num - 1) + str.substring(0, num - 1);}// 累加結(jié)果res += sum;}System.out.println(res);}更多華為od機(jī)試題請點這里<華為od機(jī)試題7 真題>,每篇8題,有更多的題也請告訴我啊
總結(jié)
以上是生活随笔為你收集整理的华为od机试题6 真题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java用什么测试工具_10款常用的JA
- 下一篇: 哥达巴赫猜想