之前投了某爲的軟件開發崗,順利通過簡歷篩選後參加了今晚的線上筆試。總的來說,某爲的題並不難,總共三道編程題,粗暴但不簡單。筆試期間腦子略有點發昏,導致第二道編程題栽在了一個小問題上,在交卷後左思右想在Linux上又重新寫出程序編譯,才發現問題所在。大概最大的感受就是遺憾吧。
某爲的第一道筆試題是輸入長度未知的字符串,然後去重,不改變排列順序輸出字符串(字符串中不包含空格)。這一題比較簡單,考慮到c語言用char*指針作爲字符串時,在讀取字符串時需要一個特殊字符'\0'來標記指針的結束位置,也就是通常認爲的字符串結束標記。而c++語言則是面向對象的,長度信息直接被存儲在了對象的成員中,讀取字符串可以直接根據這個長度來讀取,所以就沒必要需要結束標記了。可以將string對象中重複的字符用'\0'代替,編寫程序:
#include <iostream>
#include <string>
using namespace std;
int main()
{
int len;
string str;
cout << "輸入字符串:";
cin >> str;
len = str.size();
for(int i=0;i<len-1;i++){
if(str[i]!='\0'){
for(int j=i+1;j<len;j++){
if(str[i]==str[j]){
str[j]='\0';
}
}
}
else{
continue;
}
}
cout << "去重後:" << str <<endl;
return 0;
}
編譯和調試結果:
某爲的第二道筆試題的大意是12點到20點(分爲8個整點時間區間)之間會有客人到來以及離去(到來和離去都看做整點,客人需在12點之後到來,20點之前離開),統計所有客人停留的時間長度(輸入不多於100個客人的到達整點時間和離開整點時間,以“-1 -1”結束輸入),最終輸出每個時間區間客人的最大數目。題目意思有點繞,但是讀明白就能理解,重點是以每個客人停留的時間作爲循環的起點和重點,對於這段時間內的區間各加上一個“1”。
那麼,可以編寫程序:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main(){
int a[100][2]; //定義最大輸入容量
int group[8]; //定義8個整數區間
int count = 0; //定義實際輸入“客人”個數的統計參數
int flag = 1; //定義了兩次跳出循環的信號參數
for(int i=0; i<100; i++){ //將輸入信息循環存儲到數組中
for(int j=0; j<2; j++){
scanf("%d",&a[i][j]);
if(a[i][j] == -1){
flag = 0;
break;
}
}
if(flag == 0){break;}
else{count++;}
}
for(int i=0; i<8; i++){ //對group數組元素進行初始化
group[i]=0;
}
for(int i=0; i<count; i++){
for(int j=a[i][0]-12; j<a[i][1]-11; j++){ //循環遍歷時間段內所有區間,對應的group加1
group[j]++;
}
}
cout << "[12,13):" << group[0] << endl;
cout << "[13,14):" << group[1] << endl;
cout << "[14,15):" << group[2] << endl;
cout << "[15,16):" << group[3] << endl;
cout << "[16,17):" << group[4] << endl;
cout << "[17,18):" << group[5] << endl;
cout << "[18,19):" << group[6] << endl;
cout << "[19,20):" << group[7] << endl;
return 0;
}
調試結果:
其中,第一次調試結果中出現數字亂碼是因爲數組沒有進行初始化賦值。
在筆試的過程中,對於for(int j=a[i][0]-12; j<a[i][1]-11; j++)語句,我不慎將二維數組的下標起點記錯了,即for(int j=a[i][1]-12; j<a[i][2]-11; j++),導致程序始終無法通過編譯。提示存在段錯誤(堆棧或者數組存在溢出)。