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

#include<iostream>
#include<cmath>
#include<ctime>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<n;i++)sum+=i;clock_t endTime=clock();cout<<"10^"<<x<<":"<<double(endTime-startTime)/CLOCKS_PER_SEC<<"s"<<endl; }return 0;
}

结果如下:


2空间复杂度的分析:多开一个辅助的数组:O(N)
多开一个二维的数组:O(n*n)
多开一个常数空间:O(1)
实例:O(1),两个整数进行互换

#include<iostream>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);
}


例2 单词翻转+全局翻转+局部翻转+去掉空格

#include<iostream>
#include<stdio.h>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;
}

输出结果:

简单选择法排序

 #include<stdio.h>int main(){int i, index, k, n, temp;int a[10];scanf("%d", &n);for(i=0; i<n; i++)scanf("%d", &a[i]);for(k=0; k<n-1; k++){index=k;//保持前k个元素是有序的,要么前面保持最大的或者最小的k个元素 for(i=k+1; i<n; i++)if(a[i]>a[index])//该行决定了输出数组从大往小排序//if(a[i]<a[index]//表示输出数组从小到大进行排列,相对于冒牌排序不用进行很多次的两两交换,//才将最小的元素放在委派部分的第一个位置 index=i;temp=a[index];a[index]=a[k];a[k]=temp;//for(i=1; i<n; i++)//printf(" %d", a[i]);printf("\n");}printf("%d", a[0]);for(i=1; i<n; i++)printf(" %d", a[i]);return 0;
}

快速排序:

#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

#include<iostream>
#include<string.h>
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;
}

常见的算法面试问题以及代码实现相关推荐

  1. NLP中文面试学习资料:面向算法面试,理论代码俱全,登上GitHub趋势榜

    鱼羊 发自 凹非寺  量子位 报道 | 公众号 QbitAI 一年一度的秋招已经悄悄来临,征战在求职路上的你,准备好了吗? 工欲善其事,必先利其器. 这里有一份NLP面试大全,全中文教学,囊括机器学习 ...

  2. ++代码实现 感知机的原理_常见排序算法原理及JS代码实现

    来源:SegmentFault 思否社区 作者:Warren 本文只是将作者学习的过程以及算法理解进行简单的分享,提供多一个角度的理解说明,或许让你的困惑能得以解决(代码或说明若有问题,欢迎留言.联系 ...

  3. 算法面试手撕代码高频题汇集

    目录 一.字符串与数组 二.链表专题 三.栈与队列 四.树 五.图与回溯

  4. 【算法面试】leetcode最常见的150道前端面试题 --- 中等题

    点击上方 前端瓶子君,关注公众号 回复算法,加入前端编程面试算法每日一题群 兄弟姐妹们,中等题来了,本篇17道,剩下63道,每周更新10道! 之前简单题的链接如下: [算法面试]leetcode最常见 ...

  5. 《大厂算法面试题目与答案汇总,剑指offer等常考算法题思路,python代码》V1.0版...

    为了进入大厂,我想很多人都会去牛客.知乎.CSDN等平台去查看面经,了解各个大厂在问技术问题的时候都会问些什么样的问题. 在看了几十上百篇面经之后,我将算法工程师的各种类型最常问到的问题都整理了出来, ...

  6. 决战春招!算法工程师面试问题及资料超详细合集(算法岗面经/代码实战/网课/竞赛等)...

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! Awesome-AI-algorithm 目录 算法面试 1. Github 20 ...

  7. php 面试靠快速排序,搞定PHP面试 - 常见排序算法及PHP实现

    常见排序算法及PHP实现全文代码使用PHP7.2语法编写 0. 五种基础排序算法对比 1. 冒泡排序(Bubble Sort) 冒泡排序 是一种交换排序,它的基本思想是:对待排序记录从后往前(逆序)进 ...

  8. COI实验室技能:常见的图像增强算法(含MATLAB代码)

    COI实验室技能:常见的图像增强算法(含MATLAB代码)   成像系统采集到的图片有时不一定具有很好的图像质量,往往需要进行一些图像增强的操作.本文主要整理了几种常见的图像增强算法,包括:同态滤波. ...

  9. java的一段排序代码_Java常见排序算法——快速排序

    概念: 通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分小,则可分别对这两部分记录继续进行排序,直到整个序列有序. 原理: 在数据集之中,选择一个元素作为"基准 ...

最新文章

  1. 为实验室部署Symantec Antivirus
  2. 基于Netty+Zookeeper实现Dubbo
  3. android 管理类,android 线程管理类
  4. 操作系统之虚拟存储管理
  5. 现男友代言!最强自拍手机荣耀20S正式发布:售价1899元起
  6. Leetcode 99. 恢复搜索二叉树
  7. 【开源打印组件】vue-plugin-hiprint初体验
  8. 微服务SpringBoot整合Jasypt加密工具
  9. Apple苹果iOS数据丢失如何恢复?
  10. UE接入过程(LTE和NR)
  11. 浏览器主页被劫持篡改了怎么办
  12. png转成SVG方法
  13. 二维码扫描+长按识别二维码demo
  14. 2018-2019-2 20175227张雪莹《Java程序设计》实验五 《网络编程与安全》
  15. (root) Additional property nginx is not allowed
  16. 常用处理海量数据的思路和方法
  17. Tauri 入门教程
  18. 匠心锁致·奋斗有我|中科易安无线智能门锁2021奋斗者计划来袭
  19. leo_流动人口信息管理系统
  20. be carefull in c

热门文章

  1. Linux内存,先看这篇文章
  2. 三星的S3C2440A 存储器控制器
  3. 程序的内存分配模式(堆栈以及静态存储区,文字常量区,代码区)
  4. Linux下打印调试管理
  5. DataWhale组队-Pandas(下)缺失数据(打卡)
  6. mysql查询数据库第一条记录_SQL获取第一条记录的方法(sqlserver、oracle、mysql数据库)...
  7. python中内置的集成开发工具_python应用(3):启用集成开发工具pycharm
  8. python 批量处理文件_python批量处理文件或文件夹
  9. JS高级——函数执行、作用域链内存结构图
  10. LeetCode 1800. 最大升序子数组和