1. 程式人生 > >某公司筆試程式設計題

某公司筆試程式設計題

參加了某公司程式設計題,這些題都來自牛客網,記錄總結吧!

一、蛇形矩陣

題目描述

蛇形矩陣是有1開始的自然數依次排列成的一個上三角矩陣.
介面說明

void GetResult(int Num, int* pResult);
輸入引數:
int Num :輸入的正整數N
輸出引數:
int *pResult: 指向放蛇形矩陣的字串指標指標指向的記憶體區域保證有效

樣例輸入:
4
樣例輸出:
1 3 6 10
2 5 9
4 8
7

分析

由於題目限定了使用int*陣列來儲存資料,我們希望根據樣例找出座標關係。
此時座標矩陣為

0  1  2  3 
4  5  6  7
8  9  10 11
12 13 14 15

我們根據蛇形矩陣的特點,依次得出每次內迴圈的座標:

0
4 1
8 5 2
12 9 6 3

比如當現在位於第3行,第一列時,對應絕對座標為(i-j)*n +j-1 = (3-1)*4+1-1=9,那麼要得到下一個座標時,我們只需讓絕對座標整體減少一行即可:9-4=5=(3-2)*4+1-1,此時也對應了內迴圈中j的自增。
程式碼:

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

void GetResult(int
Num, int * pResult) { int n = Num; int *arr = pResult; int number = 1; for (int i = 1; i <= n; i++) { for (int j = 1; j <= i; j++) { // cout<<((i - j) * n + (j - 1)); *(arr + (i - j) * n + (j - 1)) = number++; } cout
<<endl; } } int main() { int n; while(cin >> n) { int *ret = new int[n*n]; GetResult(n, ret); for (int i = 0; i<n; i++) { for (int j = 0; j<n - i; j++) { cout << *(ret + i * n + j); if (j<n - i - 1) cout << ' '; } cout << endl; } delete []ret; } return 0; }

該方法空間複雜度為O(n*n),並不是最好的辦法,後期可以優化。

二、字串旋轉

題目描述

對於一個字串,和字串中的某一位置,請設計一個演算法,將包括i位置在內的左側部分移動到右邊,將右側部分移動到左邊。

給定字串A和它的長度n以及特定位置p,請返回旋轉後的結果。

測試樣例:
"ABCDEFGH",8,4
返回:"FGHABCDE"

方法一:
迴圈移位,每次迴圈右移一個字元,將最後一個字元放到字元開頭。共移動p次。

方法二:
利用字串的方法substr() 左右切割,然後組合即可。

標準庫的string有一個substr函式用來擷取子字串。一般使用時傳入兩個引數,第一個是開始的座標(第一個字元是0),第二個是擷取的長度。

程式碼:

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


string rotateString(string A, int n, int p) {
    string s;
    for (int i = 0; i < n - p - 1; ++i) {
        char ch = A[n - 1];
        for (int j = n - 1; j >= 1; --j) {
            A[j] = A[j - 1];
        }
        A[0] = ch;
    }
    s = A;
    return s;
}

string rotateString1(string str, int n, int p) {

    string leftStr = str.substr(0,p+1);
    string rightStr = str.substr(p+1,n);

    return rightStr+leftStr;
}
int main()
{
    string str = "ABCDEFGH";
    string s = rotateString(str,8,4);
    cout<<s<<endl;

     cout<<rotateString1(str,8,4)<<endl;

    return 0;

}

三、字串求子串次數。

題目描述

求子串在母串中出現的次數。

測試樣例:
輸入
aaaaaa
aa
返回:3

程式碼:


#include<iostream>
#include<string>

using namespace std;

int main(){

    string str;
    string substr;
    while(cin>>str>>substr)
    {
        int start = 0;
        int count = 0;
        int len = str.length();
        int sublen = substr.length();
        while(start+sublen <=len)
        {
            if(str.substr(start,sublen) == substr)
            {
                count++;
                start += sublen;
            }
            else
            {
                start++;
            }
        }

         cout<<count<<endl;
    }
    return 0;
}