複試上機指南之小技巧篇(1)

一、輸入一組整數

這個就是輸入一組整數,數組的話沒法用,因爲數組是定長的,所以我們採用vector結合cin.get()進行判斷。

int input;
vector<int> vec;//vector的好處就在是一個動態數組,我們可以在不指定長度的情況下,輸入任意長度的數字
while(cin>>input){
	vec.push_back(input);
	if(cin.get()=='\n')
		break;
}

二、單鏈表的遞歸逆序輸出

我們在機試中經常遇到單鏈表的逆序輸出的問題,2018北理的機試題中規定必須採用遞歸、鏈表輸出,所以必須得掌握。

void reverse_input_list(node *q){
	if(q->next!=NULL)
		reverse_input_list(q->next);
	cout<<q->data<<" ";
}

在使用的時候,採用頭插或者尾插,建立好鏈表之後把頭結點傳入函數中,就OK了。

三、等腰梯形或者三角形

這也是機試中經常出現的點,雖然不難,但是有時候臨時想還是考驗邏輯能力的。

cin>>n;
for(i=0;i<n;i++){
	for(j=0;j<n-1-i;j++)
		cout<<' ';
	for(k=0;k<n+2*i;k++)
		cout<<'*';
	cout<<endl;
}

四、關於結構體

這一類題經常是以學生信息、成績等爲背景進行考察,這個是一個關於學生成績輸入,統計掛科兩門以上的學生、輸出信息,並按照每個人的掛科數目進行排序輸出,這個難點在成績的不確定。我是在結構體中定義了一個vector< float> score.

typedef struct Student{
	string name;
	int no;//學號
	vector<float> score;
}student;

下面是具體的輸入信息:

while(cin>>scor){
	if(scor == -1)
		break;
	s[cnt].score.push_back(scor);//cnt是結構體數組,表示第幾個學生。
}

五、字符串中的小數,輸出出來

我們經常遇到需要把一個字符串中的數字輸出出來,可以是整數、小數、正負數(前面有正負號需要帶着正負號)。首先是輸入之後,我們需要進行判斷。

cin>>s;
	int i;
	for(i=0;i<s.length();i++){
		if(s[i]>='0'&&s[i]<='9' || s[i]=='+'||s[i]=='-'){
			i=judge(i);//此處是第一次輸入i,經過完整的判斷在
			           //輸出完這個數字之後,下一個不符合判斷條件的字符的開始
			           //此處的i的精髓,judge()函數返回的是第一個不符合輸出條件的字符的下標,我們用i接受這個
			           //下標,對現在的i++再次開始判斷是否符合進入判斷的條件,精髓認真理解。
		}
	}

接下來就是進行小數、負數、正數、純數字的輸出了,其中還包括類似於+004.500這種數字輸出爲+4.5。

int judge(int i){//這個i是元素的下標。
	int flag=1;//負數輸出時,將flag賦值-1,乘上輸出的數。
	bool a=false;
	double point=1,num=0;//表示點,在查找的過程中,可以將.後面的數字呈上point。
	do{//在循環中會一直判斷下一個字符是不是符合要求,.或者數字來操作。
		if(s[i]>='0'&&s[i]<='9'){//純數字或者小數的精髓,通過設置point的值來使其不斷*0.1,使得2.3333這種也可以輸出。
			if(point>=1){
				num=num*10+s[i]-'0';
			}
			else{
				num=num+point*(s[i]-'0');
				point*=0.1;//考慮存在2.333這種情況。
			}
		}
		else if(s[i]=='-')
			flag *= -1;
		else if(s[i]=='+')
			a=true;
		else if(s[i]=='.')
			point*=0.1;
	}while(!endof(s[++i])&&i<s.length());
	if(a)
		cout<<'+';
	cout<<num * flag<<' ';
	return i-1;//在循環判斷的時候,是判斷符合條件的下一位是不是符合條件,所以i在返回時需要-1.
}

六、關於字符串的拼接問題

這個題是關於全排列的,意思是給a,b,c三個字符,輸入n,加入n=2,那就輸出aa,ab,ac,bb,ba,bc,cc,cb,ca,9最後再輸出一共有幾個,這個題我的思路是,一個string,一個vector< char> v;

	if(n==1){
		show(v);
		return 0;
	}
	else{
		while(--n){
			v=fun(v,a);//此處必須帶參數做,例:n=3,其運行情況是先n=2,此時循環結束之後,v中的字符爲aa,ab,ac.....,之後再n--,n=1。
			           //結果保存了之後返回給v,然後v再作爲參數傳回給fun,
			           //此時的v是aa,ab,ac.....,然後繼續拼接單個字符,以此類推n=4,n=5...
		}
		show(v);	
	}

下面是fun函數,是用了一個返回vector的函數,因爲每次這個返回的vector都要作爲下一次循環的參數進行繼續判斷。

vector<string> fun(vector<string> v,string a){
	int i,j;
	vector<string> ve;
	for(i=0;i<v.size();i++){
		for(j=0;j<a.length();j++){
			string tem="";//初始化字符串爲空
			tem+=v[i];
			tem+=a[j];
			ve.push_back(tem);
		}
	}
	return ve;
}

七、提取一個整數的每位數

就是在判斷迴文數、水仙花數的時候,我們需要知道輸入數字的每一位,然後進行判斷。

num=n;
len=0;
while(num){
    arr[len++]=num%10;//取餘之後的結果存放在arr中,是從低位到高位的存放
    num/=10;//每次取餘結束之後,/10,因爲int是向下取整,所以123除10就是12.
}

八、輾轉相除求最大公約數

int gcd(int a,int b){
    int t;
    if(a<b){///使a大b小
        t=b;b=a;a=t;
    }
    while((t=a%b)!=0){///餘數不爲0時
        a=b;///被除數作除數
        b=t;///餘數作被除數
    }///餘數總是比除數小
    return b;///最後整除的除數是最大公約數
}

九、讀寫文件

#include <iostream.h>  
#include <fstream.h>  
#include <stdlib.h>  
int main(){
    char fname[20]="abc.txt";
    ofstream out(abc.txt);
    if(out.is_open()){
        out<<"Hello,file!"<<endl;
    }
    
    char buffer[1024];
    ifstream in("abc.txt");  
    if(!in.is_open()){
        cout<<"open file failed!"<<endl;
        exit(1);
    }
    while(!in.eof()){
        in.getline(buffer,256);
        cout<<buffer<<endl;
    }
    in.close();
    return 0;  
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章