CVTE c/c++軟體類線上筆試 程式設計題
昨天參加了CVTE的線上筆試,由於隔了很久沒有接觸C語言了,C++自學的狀態也不是很好,再加上最近搞畢設腦袋裡全是MATLAB的語法等。筆試狀態不是很好,程式設計題挺簡單的,但是由於時間心態原因做的不對或者不全,特私下自己改正了下。前面部分是自己寫的不優秀的程式碼,後面部分是參考資料後改善的程式碼,有關複雜度的改善見本文後段。
由於是C++初學者,程式碼有哪些不合適或者可以簡便些的地方,還望讀者能夠指出,我們一起討論與學習。
1.輸入一個整型陣列,數組裡有正數也有負數。陣列中連續的一個或多個整陣列成一個子陣列,每個子陣列都有一個“和”。輸出所有子陣列中“和”最大的子陣列。要求時間複雜度為O
完整程式:
#include<iostream>
#include<stdlib.h>
using namespace std;
int main()
{
int max=0;
int N;
int num2=0;
int num1=0;
int *arr;
cout<<"請輸入一個大小為N的整型陣列,包含正負整數"<<endl;
cout<<"N=";
cin>>N;
arr=new int[N];
for(int k=0;k<N;k++)
{
cin>>arr[k];
}
for(int i=0;i<N;i++)
{
int temp=0;
for(int j=i;j<N;j++)
{
temp+=arr[j];
if(temp>max)
{
max=temp;//如果多加了數的值比MAX大,則將該較大的值賦給MAX
num2=j;
num1=i;
}
}
}
cout<<"最大子陣列為:";
for(int m=num1;m<=num2;m++)
{
cout<<arr[m]<<" ";
}
cout<<endl<<"最大子陣列的和為:"<<max<<endl;
system("pause");
return 0;
}
執行結果:
2.一個允許重複,長度為N的整型陣列,請找出現次數超過N/2的第一個數字。請實現此函式:int getResult(int *array,int length);
完整程式:
#include<iostream>
#include<stdlib.h>
using namespace std;
int getResult(int *array,int length);
int main()
{
int arr[]={3,5,4,3,3};
int theNum;
theNum=getResult(arr,5);
cout<<"出現次數超過N/2的數字是:"<<theNum<<endl;
system("pause");
return 0;
}
int getResult(int *array,int length)
{
int temp=0;
int theNum=0;
for(int i=0;i<(length+1)/2;i++)
{
int num=1;
temp=array[i];
for(int j=i+1;j<length;j++)
{
if(array[j]==temp)
++num;
}
if(num>length/2)
{
theNum=temp;
break;
}
}
return theNum;
}
執行結果:
演算法時間複雜度的問題分析
時間複雜度是總運算次數表示式中受n的變化影響最大的那一項(不含係數)
比如:一般總運算次數表示式類似於這樣:a*2^n+b*n^3+c*n^2+d*n*lg(n)+e*n+f,a ! =0時,時間複雜度就是O(2^n)。