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

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;	
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/480054.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里P8架构师谈:高并发与多线程的关系、区别、高并发的技术方案

什么是高并发&#xff1f; 高并发&#xff08;High Concurrency&#xff09;是一种系统运行过程中遇到的一种“短时间内遇到大量操作请求”的情况&#xff0c;主要发生在web系统集中大量访问收到大量请求&#xff08;例如&#xff1a;12306的抢票情况&#xff1b;天猫双十一活动…

LeetCode 1. 两数之和(哈希)

文章目录1. 题目2. 解题1. 暴力解法2. 哈希法3. python3解答1. 题目 题目链接&#xff1a;https://leetcode-cn.com/problems/two-sum/ 给定一个整数数组 nums 和一个目标值 target&#xff0c;请你在该数组中找出和为目标值的那 两个 整数&#xff0c;并返回他们的数组下标。…

论文浅尝 | TuckER:基于张量分解的知识图谱补全

笔记整理&#xff1a;孙泽群&#xff0c;南京大学计算机科学与技术系&#xff0c;博士研究生。论文链接&#xff1a;https://arxiv.org/abs/1901.09590背景知识图谱是图结构的数据库&#xff0c;以三元组(es, r, eo)的形式存储事实&#xff0c;其中es和eo分别表示主语和宾语实体…

阿里Java P系列技术要求(P5-P7)

阿里p系列薪资&#xff08;最新数据比这个高1倍左右&#xff09; 阿里P5&#xff08;高级研发工程师&#xff09; 工作要求&#xff1a; 能独立完成日常工作&#xff0c;并能够对一些方案提出自己的建议。 基本考核就是能上手独立完成工作&#xff0c;熟练掌握。 技能要求…

如何配置一台深度学习工作站?

星标/置顶小屋&#xff0c;带你解锁最萌最前沿的NLP、搜索与推荐技术这篇文章主要介绍的是家用的深度学习工作站&#xff0c;典型的配置有两种&#xff0c;分别是一个 GPU 的机器和四个 GPU的机器。如果需要更多的 GPU 可以考虑配置两台四个 GPU 的机器。如果希望一台机器同时具…

LeetCode 2. 两数相加(单链表反转)

题目链接&#xff1a;https://leetcode-cn.com/problems/add-two-numbers/ 给出两个 非空 的链表用来表示两个非负的整数。其中&#xff0c;它们各自的位数是按照 逆序 的方式存储的&#xff0c;并且它们的每个节点只能存储 一位 数字。 如果&#xff0c;我们将这两个数相加起…

报名 | 全国知识图谱与语义计算大会(CCKS 2019)评测任务发布

全国知识图谱与语义计算大会是由中国中文信息学会语言与知识计算专委会定期举办的全国年度学术会议。CCKS 2018吸引了来自学术界和工业界的超800人参加。2019 年全国知识图谱和语义计算大会(www.ccks2019.cn) 将于2019年8月24日至8月27日在杭州召开&#xff0c;CCKS 2019的主题…

UML是什么?UML常用图以及建模工具有哪些?

“ 在做项目设计方案的时候&#xff0c;理解为需求后&#xff0c;我们都会做技术设计方案&#xff0c;这个时候就需要用到UML建模&#xff0c;涉及到UML常用图形以及工具画图&#xff0c;以下我会详细介绍UML图形和我个人推荐的UML建模工具。 UML即Unified Model Language&am…

炼丹必备!推荐一个超级好用的机器学习云平台

矩池云是一个专业的国内深度学习云平台&#xff0c;拥有着良好的深度学习云端训练体验&#xff0c;和高性价比的自建GPU集群资源。高性价比矩池云拥有很高的性价比&#xff0c;其的计费方式主要分为按时租与按周/月租。按时租用采用的是分钟级的实时计费模式&#xff0c;满足了…

直通BAT必考题系列:深入详解JVM内存模型与JVM参数详细配置

JVM基本是BAT面试必考的内容&#xff0c;今天我们先从JVM内存模型开启详解整个JVM系列&#xff0c;希望看完整个系列后&#xff0c;可以轻松通过BAT关于JVM的考核。 BAT必考JVM系列专题 1.JVM内存模型 2.JVM垃圾回收算法 3.JVM垃圾回收器 4.JVM参数详解 5.JVM性能调优 JV…

论文浅尝 | 基于平行新闻的Bootstrapping关系抽取

笔记整理&#xff1a;吴锐&#xff0c;东南大学大四本科生&#xff0c;研究方向为自然语言处理。Citation&#xff1a;Michael Glass, K. B. . (2012). Bootstrapping relation extraction using parallel news articles. Retrieved from https://pdfs.semanticscholar.org/bfa…

动态规划应用--最长递增子序列 LeetCode 300

文章目录1. 问题描述2. 解题思路2.1 动态规划2.2 二分查找1. 问题描述 有一个数字序列包含n个不同的数字&#xff0c;如何求出这个序列中的最长递增子序列长度&#xff1f;比如2&#xff0c;9&#xff0c;3&#xff0c;6&#xff0c;5&#xff0c;1&#xff0c;7这样一组数字序…

论文浅尝 | 5 篇顶会论文带你了解知识图谱最新研究进展

本文转载自公众号&#xff1a;PaperWeekly。精选 5 篇来自 ICLR 2019、WSDM 2019、EMNLP 2018、CIKM 2018和IJCAI 2018 的知识图谱相关工作&#xff0c;带你快速了解知识图谱领域最新研究进展。WSDM 2019■ 论文解读 | 张文&#xff0c;浙江大学在读博士&#xff0c;研究方向为…

LeetCode 53. 最大子序和(动态规划)

文章目录1. 题目描述2. 解题2.1 暴力求解2.2 动态规划1. 题目描述 题目链接&#xff1a;https://leetcode-cn.com/problems/maximum-subarray/ 《剑指Offer》同题&#xff1a;面试题42. 连续子数组的最大和 给定一个整数数组 nums &#xff0c;找到一个具有最大和的连续子数组…

java程序员的发展之路和职业规划

在互联网做技术的朋友&#xff0c;往往没有足够的重视&#xff0c;职业规划其实一点都不虚&#xff0c;而是一件非常实在的事情&#xff0c;如果你不是每次碰墙再反思职业规划&#xff0c;而是提前3年左右作出下一步的规划&#xff0c;你早已经走出了一条属于自己的路。 以下是…

图Graph--拓扑排序(Topological Sorting)

文章目录1. 拓扑排序2. 算法实现2.1 Kahn算法2.2 DFS算法2.3 时间复杂度3. 应用4. 类似题目练习一个项目往往会包含很多代码源文件。编译器在编译整个项目时&#xff0c;需按照依赖关系&#xff0c;依次编译每个源文件。比如&#xff0c;A.cpp依赖B.cpp&#xff0c;那在编译时&…

SIGIR20最佳论文:通往公平、公正的Learning to Rank!

星标/置顶小屋&#xff0c;带你解锁最萌最前沿的NLP、搜索与推荐技术文 | 机智的叉烧编 | 兔子酱大家好&#xff0c;我是叉烧。感谢卖萌屋再次给我机会在这里分享~SIGIR2020 的 best paper 终于出炉&#xff0c;这次获奖论文是 Controlling Fairness and Bias in Dynamic Learn…

论文浅尝 | 基于属性嵌入的知识图谱间实体对齐方法

笔记整理&#xff1a;张清恒&#xff0c;南京大学计算机科学与技术系&#xff0c;硕士研究生。论文链接&#xff1a;https://people.eng.unimelb.edu.au/jianzhongq/papers/AAAI2019_EntityAlignment.pdf发表会议&#xff1a;AAAI 2019摘要近来&#xff0c;针对跨知识图谱&…

一篇文章了解架构师能力模型

每一个技术人都有着一个架构师的梦&#xff0c;希望自己有朝一日能登上技术之巅&#xff0c;以下结合我自己13年的从业经验&#xff0c;分别从架构师进阶之路、架构师能力模型&#xff08;这里是亮点&#xff09;、架构师技能树、架构师业务技能树谈起&#xff0c;完整的剖析一…

首篇严肃的“BERT学”研究,40+论文对比,解读 BERT 工作原理

BERT解读&#xff08;论文 TensorFlow源码&#xff09;&#xff1a;https://blog.csdn.net/Magical_Bubble/article/details/89514057?depth_1- 解读ALBERT&#xff1a; https://blog.csdn.net/weixin_37947156/article/details/101529943 一文揭开ALBERT的神秘面纱&#…