1. 程式人生 > >華為2013機試題

華為2013機試題

一、刪除子串
1、題目描述:
只要是原串中有相同的子串就刪掉,不管有多少個,返回子串的個數。
2、題目分析:
我們對比該題與《HWOJ 在一個字元中刪除第二個字元出現過的所有字元》《HWOJ 實現一個聽高階的字元匹配演算法》都是不一樣的。一定要注意區分
所以我們這道題不適合用雜湊表來完成。
我們可以利用指標來完成
3、演算法思路:
利用字串str迴圈,之後將和sub_str長度複製給一個新的字串temp
所以我們這裡需要用malloc來動態申請記憶體空間,而用free來釋放malloc申請的空間
這裡我們採用什麼函式複製呢?memcpy還是strcpy呢?
4、補充:
strcpy和memcpy主要有以下2方面的區別。


1、複製的內容不同。strcpy只能複製字串,而memcpy可以複製任意內容,例如字元陣列、整型、結構體、類等。
2、複製的方法不同。strcpy不需要指定長度,它遇到被複制字元的串結束符"\0"才結束,所以容易溢位。memcpy則是根據其第3個引數決定複製的長度。
雖然做的是字串,所以我們這裡因為需要指定長度,所以我們選擇用memcpy
之後去比較temp和sub_str,用str_cmp去比較,如果相同說明有相同子串,直接str = str + len1;
如果不同說明沒有,直接儲存在*result中,且分別加1

 

#include <iostream>

#include

 <string>

const int maxn = 1000;

using namespace std;

 

int delete_sub_str(const char *str, const char *sub_str, char *result)

{

//非法輸入

if (str == NULL || sub_str == NULL)

return 0;

 

//初始化

int

 len1 = strlen(sub_str);

int cnt = 0;

char *temp = NULL;

 

temp = (char *)malloc(len1 + 1);

while (*str)

{

memset(temp, 0, len1 + 1);

memcpy(temp, str, len1);

if (strcmp(temp, sub_str) == 0)

{

cnt++;

str = str + len1;

}

else

{

*result = *str;

str++;

result++;

}

}

*result++ = '\0';

free(temp);

return cnt;

}

 

int main()

{

char str[maxn];

char sub_str[maxn];

char result[maxn];

cin>>str;

cin>>sub_str;

int num = delete_sub_str(str, sub_str, result);

cout << num << endl;

cout << result << endl;

 

system("pause");

}

二、約瑟夫環

題目:約瑟夫環
約瑟夫環是一個數學的應用問題:已知n個人(以編號1,2,3...n分別表示)圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列;他的下一個人又從1開始報數,數到m的那個人又出列;依此規律重複下去,直到圓桌周圍的人全部出列。
題目分析:
這道題主要是想考察連結串列的知識。
演算法思路一:用環形連結串列模擬圓圈
我們這裡採用模板庫中的std::list來模擬一個環形連結串列,由於std::list本身不是一個環形結構,所以我們每次迭代器iterator掃描到連結串列末尾的時候,我們要記得把迭代器移到連結串列的頭部,這樣就相當於按照順序在一個圓圈中遍歷了。
演算法思路二:利用觀察數學規律分析剩下數字的規律還迴圈或者遞迴

迴文數字判斷 
描述:有這樣一類數字,他們順著看和倒著看是相同的數,例如:121,656,2332等,這樣的數字就稱為:迴文數字。判斷某數字是否是迴文數字。 
執行時間限制:10Sec 
記憶體限制:128MByte 
輸入:整型數字 
輸出:0:不是迴文數字;1:是迴文數字。 
樣例輸入:121 
樣例輸出:1 

#include <iostream>

#include <string>

#include <sstream>

using namespace std;

void huiwen(char  str[])

{

int flag = 1;

int len = strlen(str);

for (int i = 0; i<len / 2; i++)

{

if (str[i] != str[len - i - 1])//二分數字,首個數字和末尾數字依次相等

{

flag = 0;//不等,說明不是迴文,輸出的k0

break;

}

}

cout << flag;//判斷是否是迴文的標誌

}

 

 

void main()

{

char input[100];

cin >> input;

//需要判斷輸入的是否是整型數字,若不是,輸出0,即肯定不是迴文數字

for (int i = 0; i < strlen(input); i++)

{

if (!isdigit(input[i]))

{

cout << 0;

return;

}

}

huiwen(input);

cout << endl;

system("pause");

}