常见的算法面试问题以及代码实现

1 时间复杂度分析
一个简单的时间测试代码如下:

#include
#include
#include

using namespace std;

int main(){
	for(int x=1;x<=9;x++){
		int n=pow(10,x);
		
		clock_t startTime=clock();
	    
	    int sum=0;
	    for(int i=0;i

结果如下:
常见的算法面试问题以及代码实现_第1张图片
常见的算法面试问题以及代码实现_第2张图片
2空间复杂度的分析:多开一个辅助的数组:O(N)
多开一个二维的数组:O(n*n)
多开一个常数空间:O(1)
实例:O(1),两个整数进行互换

#include

void swapTwoInts(int &a,int &b){
	int temp=a;
	a=b;
	b=temp;
}
int main(){
	int a,b;
	scanf("%d%d",&a,&b);
	swapTwoInts(a,b);
	printf("%d  %d",a,b);
}

常见的算法面试问题以及代码实现_第3张图片
例2 单词翻转+全局翻转+局部翻转+去掉空格

#include
#include

using namespace std;
 
void reverse(char * s, int first, int last)
{
	while (first < last)
	{
		char tmp = s[first];
		s[first++] = s[last];
		s[last--] = tmp;
	}
}
 
void reverseWords(char *s) {
	int last = 0, now = 0;
	//翻转每个单词,同时翻转整个字符串,则对应单词拼写正确
	while (s[now])
	{
		while (s[now] == ' ') now++;
		last = now;
		while (s[now] != ' ' && s[now] != '\0') now++;
		reverse(s, last, now - 1);
	}
	reverse(s, 0, now - 1);
	last = 0;
 
	//删除多余的空格
	for (int i = 0; i < now; i++)
	{
        if(!isblank(s[i]) || (last && s[last - 1] != s[i]))
		s[last++] = s[i];
	}
	s[last] = 0;
	if (last && s[last - 1] == ' ')
		s[last - 1] = 0;
}
int main()
{
    //char str[] = "I am from Shanghai";
    char str[100];
    scanf("%[^\n]",str);//scanf("%[^\n]",str);其中的%[^\n]" 可以读取空格,回车结束输入
    //scanf("%s",str) 比如字符串:what are you doing. 它 只读到what就结束 
    printf("str = %s\n",str);

    reverseWords(str);
    printf("src = %s\n", str);
    return 0;
}

输出结果:
常见的算法面试问题以及代码实现_第4张图片
简单选择法排序

 #include
    int main()
    {
    	int i, index, k, n, temp;
    	int a[10];
    	scanf("%d", &n);
    	for(i=0; ia[index])//该行决定了输出数组从大往小排序
    			//if(a[i]

快速排序:

#include
using namespace std;
void quick_sort(int left,int right);
int a[100001];
int main()
{
    int n,i;
    cin>>n;
    for(i=0;i>a[i];
    quick_sort(0,n);
    for(i=1;i<=n;i++)
        cout<mid)	j--;
        
        if(i<=j)
        {
            temp=a[i];a[i]=a[j];a[j]=temp;
            i++;j--;            
        }
    }
    if(lefti)	quick_sort(i,right);
}

归并排序:

#include 
#include 
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 > 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

最长回文子串+最长长度

#include
#include
#include

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

0-1背包动态规划实现+完整的输入和输出

#include
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>>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<

求解剩余最大数
示例数据:
92081346717538 10
输出:9878

#include 
#include
int main(){
	char a[101];
	int m;
	scanf("%s %d",a,&m);
	while(m--){
		int i=0;
		while(a[i+1] && a[i]>a[i+1])
		i++;
		
		a[i]=0;
		strcat(a,a+1+i);
		
	}
	puts(a);
	return 0;	
}

你可能感兴趣的:(面试经验)