本文章旨在提供乙個互相學習和交流的平台,也作為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...