華為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
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
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;//不等,說明不是迴文,輸出的k為0
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");
}