華為OJ之初級篇

2021-07-13 15:42:40 字數 3759 閱讀 9094

本文章旨在提供乙個互相學習和交流的平台,也作為oj刷題這段時光的記錄。本人非計算機科班出身,程式主要以實現功能性需求為主,暫不考慮效能、質量等因素。以下oj題目順序為成功通過機器驗證的順序,本篇題目全出自初級題系列。為了保證本文介面的簡潔性,**以**片形式給出,見相關「答案點這裡」鏈結。

1.在字串中找出連續最長的數字串

題目概述

請乙個在字串中找出連續最長的數字串,並把這個串的長度返回;如果存在長度相同的連續數字串,返回最後乙個連續數字串;

注意:數字串只需要是數字組成的就可以,並不要求順序,比如數字串「1234」的長度就小於數字串「1359055」,如果沒有數字,則返回空字串(「」)而不是null!

答案點這裡

思路及小結

遍歷輸入字串的每個字元,遇到數字字元,即'0'-'9'之間的字元,記錄下數字串的起始位址及長度len_tem,一段數字串結束後將起始位址及長度賦給str及len,將下一次儲存的數字串長度tem_len與len相比較,儲存長度較長的數字串起始位址及長度。遍歷完之後,首先分配數字串大小為(len + 1)的空間,將儲存的數字串複製到給空間後,若len為0,則將分配的空間賦為"",最後將該空間的位址賦給輸出字串。

2.物件管理器

題目概述

實現物件管理器功能,其中管理的物件有3個外部關鍵字,要求實現:

增加物件;

刪除物件;

判斷物件是否存在;

說明: 物件的三個外部關鍵字分別以key1,key2,key3表示。

物件的3個外部關鍵字key1,key2,key3, 其取值範圍都為:0~65535;

物件總個數小於等於10000;

以上規格由用例保證。

答案1點這裡

答案2點這裡

思路及小結

答案1為容器方式實現,答案2用鍊錶實現。該題實質為對c++中vector的基本操作或者說是c語言中煉表的基本操作。當然用vector方式顯得更為直觀。

3.刪除重複字元

題目概述

刪除重複字元

給定乙個字串,將字串中所有和前面重複多餘的字元刪除,其餘字元保留,輸出處理後的字串。需要保證字元出現的先後順序,並且區分大小寫。

答案點這裡

思路及小結

用乙個bool型的陣列表示字元的重複情況,該陣列大小為129,使用前先全初始化為false,ascii碼最大為127,因此129長度足夠了,遍歷輸入字串的每乙個字元,若對應字元的狀態為false,將其加到輸出字串中去,並將字元的bool狀態置為true,下一次就不儲存該字元了。

4.24點遊戲演算法

題目概述

給出4個1-10的數字,通過加減乘除,得到數字為24就算勝利

答案點這裡

思路及小結

此題為第乙個設計到較複雜演算法的題,由於是4個運算元,3個運算子,將每一次運算看做乙個單元,該單元的結果可能和下乙個運算元用下乙個運算子構成下乙個單元,因此有三個單元,窮舉所有可能的運算方式,包括加入括號的情況。具體分析如下:

假如運算元為a,b,c,d,操作符用_代替,其中a,b,c,d的順序不固定(見實際**實現過程),_可能取+、-、*、/。加入括號,總共有5種可能的運算方式情形:

1.((a_b)_c)_d

2.a_((b_c)_d)

3.(a_(b_c))_d

4.a_(b_(c_d))

5.((a_b)_(c_d))

根據上面的概念約定,乙個單元(即程式中的函式)包括乙個運算子及兩個運算元,結果為運算結果。將該單元記為函式float oper(int f,float var1,float var2);因此上述5種情況的第一種可表示為:

float result = oper(f3,oper(f2,oper(f1,a,b),c),d);

其中,result為四個運算元運算後的結果,f1,f2,f3分別表示1中第

一、二、三個"_"表示的運算子。2、3、4、5情況的表示以此類推。將result的結果和24進行比較,考慮到存在除法的情況,允許一定範圍的誤差。若result和24接近表示運算元a,b,c,d可構成24點,返回true,結束,在程式的結尾返回false,表示未找到。

以上演算法非本人原創,根據乙個24點網頁小應用改編,點此進入,感興趣可以參考一下其原始碼。

5.週期串問題

題目概述

如果乙個字串可以由某個長度為k的字串重複多次得到,我們說該串以k為週期。例如,abcabcabcabc以3為週期(注意,它也可以6和12為週期,結果取最小週期3)。字串的長度小於等於100,由呼叫者保證。

介面說明

原型:int getminperiod(char *inputstring);

輸入引數:

char * inputstring:字串

返回值:

int 字串最小週期

答案點這裡

思路及小結

先找週期。由於週期必然能被字串長度整除,因此以1到字串長度為因子,判斷是否能被字串長度整除,若可以整除,遍歷輸入字串,判斷是否週期性重複。

6.最後乙個單詞長度

題目概述

求輸入字串最後乙個單詞的長度,如hello world,返回5。

輸入引數:

字串,最大長度為128

返回值:

最後乙個單詞長度

答案點這裡

思路及小結

從後往前找空格,然後輸出空格之後字元長度。若未找到空格,輸出字串長度。

7.百分制成績

簡要描述:給出一百分制成績,要求輸出成績等級『a』、『b』、『c』、『d』、『e』。90分以上為a 80-89分為b 70-79分為c 60-69分為d 60分以下為e

輸入:乙個整數0-100以內

輸出:乙個字元,表示成績等級

例如:輸入:90

輸出:a

答案點這裡

8.阿姆斯特朗數

簡要描述:如果乙個正整數等於其各個數字的立方和,則該數稱為阿姆斯特朗數(亦稱為自戀性數),1除外,如407 = 43+03+73就是乙個阿姆斯特朗數。試程式設計求n(n ≤ 65536)以內的所有阿姆斯特朗數。

介面說明

原型:int calcarmstrongnumber(int n);

輸入引數:

int n: n ≤ 65536

返回值:

n以內的阿姆斯特朗數的數量

答案點這裡

9.查詢同構數的數量

簡要描述:找出1至n之間同構數的個數。同構數是這樣一組數:它出現在平方數的右邊。例如:5是25右邊的數,25是625右邊的數,5和25都是同構數。

詳細描述:

介面說明

原型:intsearchsameconstructnum(int n);

輸入引數:

int n:查詢1至n之間的全部同構數

返回值:

int:1至n之間同構數的個數

答案點這裡

10.二維陣列的列排序

簡要描述:給出乙個二維陣列,請將這個二維陣列按第i列(i從1開始)排序,如果第i列相同,則對相同的行按第i+1列的元素排序,如果第i+1列的元素也相同,則繼續比較第i+2列,以此類推,直到最後一列。如果第i列到最後一列都相同,則按原序排列。

實現以下介面:

輸入乙個m*n 的整數陣列,實現按規則排列,返回排列後的陣列。

呼叫者會保證:

比如輸入陣列為: 

1,2,3

2,3,4

2,3,1

1,3,1

按第二列排序: 

輸出:  1,

2,3 2,

3, 1

1, 3,

12,3, 4

答案點這裡

華為OJ之初級篇

11.獎金提成 簡要描述 企業發放的獎金根據利潤提成。利潤低於或等於100000元的,獎金可提10 利潤高於100000元,低於200000元 100000 200000 時 低於100000元的部分按10 提成 高於100000元的部分,可提成7.5 200000 400000時,低於200000...

華為OJ之初級篇

21.數字統計 簡要描述 對輸入的整型陣列,輸出陣列元素中的最大值 最大值的個數 最小值和最小值的個數 詳細描述 介面說明 原型 voidoutputmaxandmin int pinputinteger,intinputnum,int pmaxvalue,int pmaxnum,int pminv...

華為OJ題目 初級篇(機試OJ平台)

華為oj初級篇是本人蒐集的一些題目,都run過ok,初級題我個人感覺必要在15 20min以內完成,不然時間不夠用,一共三道,後兩道中高階題目。題目一 作業系統任務排程問題。作業系統任務分為系統任務和使用者任務兩種。其中,系統任務的優先順序 50,使用者任務的優先順序 50且 255。優先順序大於2...