1. 程式人生 > >2017校招筆試題

2017校招筆試題

題目:輸入一個字串從左到右遍歷,如果遇到三個連續相同的子串就將這個子串刪除,並將原串剩下的部分拼接到一起,重複上述過程,直到字串中沒有可以刪除的子串。
eg:
輸入:AAABCCDDDCB
AABBBABBBA
輸出:BB
A

重要:從一個字串中刪除一個子串,必須將原字串的內容strcpy到開闢的數字中(new char[SIZE]),才能改變原字串。相當於在陣列中刪除一部分。

#include<iostream>
using namespace std;
#pragma warning (disable:4996)

char
* RmoveSubstr(char *str) { if (str == NULL) return NULL; char *begin = str; //遍歷字串指標 char *sub = str; //指向有三個相同字元(子串)開始的地方 char ch; int count = 0; while (1) { ch = *begin; count = 0; while (ch == *begin) { count++, begin++; } //開始刪除
if (count == 3) { sub = begin - 3; while (*sub++ = *begin++) //逐個覆蓋 {} begin = str; //從頭開始遍歷 } //退出條件,沒有可刪除的子串了 else if (count < 3 && *begin == '\0') return str; } } int main() { /*char *str = "AAABCCDDDCB";*/
char *str = "AABBBABBBA"; int len = strlen(str); /////////////////重要/////////////// char *arr = new char[len + 1]; strcpy(arr, str); ////////////////////////////////// char *ret = RmoveSubstr(arr); cout << ret << endl; delete[] arr; return 0; }

網易
這裡寫圖片描述

/*思路:為了買儘量少的袋數,所以先要算出最多能買多少袋8個裝的
        然後用剩餘的個數/6,看是否能被6整除,如果不能則少拿一袋8個裝的
        剩餘的個數+8,再用剩餘的個數/6,以此類推,知道8個裝的個數減到0,
        還不能被6整除,則說明沒有合適的購買方法,此時剩餘的個數=總個數*/
int main()
{
    int N;
    cin >> N;
    int num8 = N / 8; //買8個裝的個數
    int surplus = N % 8; //剩餘的個數
    int num6 = 0; //買6個裝的個數

    while (num8 >= 0 && surplus != 0)
    {
        num6 = surplus / 6;
        if (surplus % 6 == 0) //剩餘的個數能被6整除,則剛剛好,可以退出程式
            break;
        else
        {
            num8--;
           //注意邊界控制,當num8 = -1時,不能再+8
            if (num8 >= 0)
                surplus += 8;
        }
    }
    //剩餘的個數 = 總個數,說明沒找到合適的買法
    if (surplus == N)
        cout << -1 << endl;
    else
    {
        cout << "buy 8 : " << num8 << endl;
        cout << "buy 6 : " << num6 << endl;
        cout <<"total : "<< num8 + num6 << endl;
    }       
    return 0;
}

滴滴
題目:求一個數的階乘末尾有幾個0
eg:10! = 3628800 輸出:2

#include<iostream>
#include<stack>
using namespace std;

//將數字裝換成字串 eg:1234->"1234"
void print(long long val)
{
    int count = 0;
    stack<long long> s;
    //向棧中依次插入1234,123,12,1
    while (val != 0)
    {
        s.push(val);
        val /= 10;
    }
    char ch[1024] = { '\0' };
    //將轉換的字元存入字元陣列中
    int len = s.size();
    for (int i = 0; i < len; i++)
    {
        long long top = s.top();
        s.pop();
        ch[i] = (top % 10) + '0';
    }       
    //從陣列的末尾計算0的個數
    for (int i = len - 1; i >= 0; i--)
    {
        if (ch[i] == '0')
            count++;
        else
            break;
    }
    cout << count << endl;
}

int main()
{
    long long n, i, j = 1;
    cout << "請輸入正整數n:" << endl;
    cin >> n;
    for (i = 1; i <= n; i++)
        j *= i;
    cout << "正整數" << n << "的階乘為:" << j << endl;
    print(j);
    return 0;
}