常见的算法面试问题以及代码实现
生活随笔
收集整理的這篇文章主要介紹了
常见的算法面试问题以及代码实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1 時間復雜度分析
一個簡單的時間測試代碼如下:
結果如下:
2空間復雜度的分析:多開一個輔助的數組:O(N)
多開一個二維的數組:O(n*n)
多開一個常數空間:O(1)
實例:O(1),兩個整數進行互換
例2 單詞翻轉+全局翻轉+局部翻轉+去掉空格
輸出結果:
簡單選擇法排序
快速排序:
#include<iostream> using namespace std; void quick_sort(int left,int right); int a[100001]; int main() {int n,i;cin>>n;for(i=0;i<n;i++) cin>>a[i];quick_sort(0,n);for(i=1;i<=n;i++)cout<<a[i]<<" ";cout<<endl;return 0; }void quick_sort(int left,int right) {int i=left,j=right;int mid,temp;mid=a[(i+j)/2];while(i<j){while(a[i]<mid) i++;while(a[j]>mid) j--;if(i<=j){temp=a[i];a[i]=a[j];a[j]=temp;i++;j--; }}if(left<j) quick_sort(left,j);if(right>i) quick_sort(i,right); }歸并排序:
#include <iostream> #include <stdlib.h> void print_array(int nums[], int n); using namespace std;void mergeOne(int nums[], int l, int m, int r){int nl = m - l + 1;int nr = r - m;int *p = NULL, *q = NULL;p = (int *) malloc (nl * sizeof(int));q = (int *) malloc (nr * sizeof(int));//將數組輸入到兩個空間中for(int i = 0; i < nl; i++) {p[i] = nums[l + i];}for(int j = 0; j < nr; j++) {q[j] = nums[m + 1 + j];}//合并兩個數組int i = 0;int j = 0;int k = l;while(i < nl && j < nr) {if(p[i] < q[j]) {nums[k++] = p[i++];}else{nums[k++] = q[j++];}}//將剩余的元素合并while(i < nl) {nums[k++] = p[i++];}while(j <nr) {nums[k++] = q[j++];} }//注意:此處的left和right必須是數組下標能取到的有效值 void mergeSort(int nums[], int left, int right) {int mid = (left + right) >> 1;if(left < right) {mergeSort(nums, left, mid);mergeSort(nums, mid+1, right);mergeOne(nums, left, mid, right);} }int main() {//int nums[]={9, 3, 5, 2, 7, 6, 4, 1};//int n = sizeof(nums)/sizeof(nums[0]);int n;cin>>n;int nums[n];for(int i=0;i<n;i++)scanf("%d",&nums[i]);mergeSort(nums, 0, n - 1);print_array(nums,n);return 0; } void print_array(int nums[], int n) {for(int i = 0; i<n; i++){printf("%d ", nums[i]);//cout<<nums[i]<<" ";}//cout<<endl; }最長回文子串+最長長度
#include<stdio.h> #include<string.h> #include<stdbool.h>char* longestpalindrome(const char *str) {bool dp[100][100];int i,j,len;int longest=1;int tmp;int n= strlen(str);char a[n];for(i=0;i<n;i++){dp[i][i]=1;if(str[i]==str[i+1]){dp[i][i+1]=1;longest=2;strncpy(a,str+i,2);}}for(len=3;len<=n;len++){for(i=0;i<=n-len;i++){j=i+len-1;if(str[i]==str[j]){dp[i][j]=dp[i+1][j-1];if(dp[i][j]==1){tmp=j-i+1;if(longest<tmp){longest=tmp;strncpy(a,str+i,tmp);}}}elsedp[i][j]=0;}}printf("%d\n",longest);char *s = a;//printf("%s\n",s); return s;} int main() {char a[20];scanf("%s",a);char*s=longestpalindrome(a);printf("%s\n",s); }0-1背包動態規劃實現+完整的輸入和輸出
#include<iostream> using namespace std; #define N 10 int n;//共有n個物品 int c;//背包總重量為c int v[N];//物品i價值為vi int w[N];//物品i的重量為wi int m[N][N];//m(i,j):背包容量為j,可選擇物品為i int x[N];//x[i]=0,第i件物品不裝入背包,x[i]=1,第i件物品裝入背包 void Knapsack(int v[],int w[],int c,int n,int m[][10]) {//由n→1計算//i=n時int jMax=min(w[n]-1,c);//背包剩余容量上限for(int j=0;j<=jMax;j++){m[n][j]=0;}for(int j=w[n];j<=c;j++){m[n][j]=v[n];}//從第n-1個到第2個for(int i=n-1;i>1;i--){jMax=min(w[i]-1,c);for(int j=0;j<=jMax;j++){m[i][j]=m[i+1][j];}for(int j=w[i];j<=c;j++){m[i][j]=max( m[i+1][j],m[i+1][j-w[i]]+v[i] );}}//第1個if(c>=w[1]){m[1][c]=max( m[2][c],m[2][c-w[1]]+v[1] );}} //x[i]=0,第i件物品不裝入背包,x[i]=1,第i件物品裝入背包 void Traceback(int m[][10],int w[],int c,int n,int x[])//構造最優解(x1,x2,…,xn)算法 {for(int i=1;i<n;i++){if(m[i][c]==m[i+1][c]){x[i]=0;}else{x[i]=1;c-=w[i];}}x[n]=(m[n][c])?1:0; } int main() {cin>>n>>c;for(int i=1;i<=n;i++){cin>>w[i]>>v[i];}for(int i=1;i<=n;i++)//初始化for(int j=0;j<=c;j++)m[i][j]=0;Knapsack( v, w, c, n, m);Traceback(m,w,c, n, x);for(int i=1;i<=n;i++){if(i==1)cout<<x[i];elsecout<<" " <<x[i];}cout<<endl;cout<<m[1][c];return 0; }求解剩余最大數
示例數據:
92081346717538 10
輸出:9878
總結
以上是生活随笔為你收集整理的常见的算法面试问题以及代码实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 科普 | 知识图谱相关的名词解释
- 下一篇: 机器学习中的特征建模(特征工程)和算法选