某公司筆試程式設計題
阿新 • • 發佈:2018-11-01
參加了某公司程式設計題,這些題都來自牛客網,記錄總結吧!
一、蛇形矩陣
題目描述
蛇形矩陣是有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;
}