没有合适的资源?快使用搜索试试~ 我知道了~
常见:面试中常见的23个算法题1
需积分: 0 0 下载量 133 浏览量
2022-08-08
17:58:11
上传
评论
收藏 304KB DOCX 举报
温馨提示
试读
39页
常见:面试中常见的23个算法题1
资源详情
资源评论
资源推荐
1.求一个集合中的连续串,使得这个连续串中各个数相加的和最大
#include<stdio.h>
int getmax(int a[], int n, int *begin, int *end);
into main(void) {
int a[] = {-1,-2,-3,100,-4,-5,6,-7,9,200};
int begin;
int end;
int sum;
sum = getmax(a,10,&begin,&end);
printf("The maximal sum is %d",sum);
printf("The begin index is %d, the end index is %d",begin,end);
return 0;
}
/*算法:
从第一个数出发,向右叠加,将他们的和累加于 sum,只要和大于零,就继续。
期间,保存这些和值中的最大值为 max。如果 sum 小于零,则从 sum 小于零的后一个重新计算。*/
/**
int getmax(int *a, int n, int *begin, int *end) {
int max = a[0];
int sum = a[0];
int tempbegin = 0;
*begin = 0;
*end = 0;
for (int i = 1; i < n; i++) {
if(sum > 0) {
sum += a[i];
} else {
tempbegin = i;
sum = a[i];
} if (max <= sum) {
max = sum;
*begin = tempbegin;
*end = i;
}
}
return max;
}
///////////////////////////////////////////////////////////////////////////////////////////
////////
2.求一个集合中的连续串,使得这个连续串中各个数相加的和最小
#include <stdio.h>
int getmin(int a[], int n, int *begin, int *end);
int main(void) {
//测试数组全部通过测试
// int a[] = {8, 9, -3, -10, 7, 0, 8, -12, 9, 8, -1 , -2, 9};
// int a[] = {1, 2, 3, 4, 5};
// int a[] = {-1, -2, -3, -5, -4};
// int a[] = {-1, 100, -1000, 100, -1};
// int a[] = {1, 1, 1, 1, 1};
// int a[] = {-1, -1, -1, -1, -1};
// int a[] = {1, -1, 1, -1};
// int a[] = {8, 9, -3, -10, 7, 0, 8, -12, 9, 8, -1, -2, 9};
int a[] = {8, 9, -3, -10, 7, -5, 2, -12, 9, 8, -1, -2, 9};
int begin;
int end;
int sum;
int k = sizeof(a)/sizeof(int);
sum = getmin(a,k,&begin,&end);
printf("The minimum sum is %d\n",sum);
printf("The begin index is %d, the end index is %d\n",begin,end);
return 0;
}
int getmin(int *a, int n, int *begin, int *end) {
int min = a[0];
int sum = a[0];
int tempbegin = 0;
*begin = 0;
*end = 0;
for (int i = 1; i < n; i++) {
if(sum < 0) {
sum = sum + a[i];
} else {
tempbegin = i;
sum = a[i];
}
if (sum <= min){
min = sum;
*begin = tempbegin;
*end = i;
}
}
return min;
}
////////////////////////////////////////////////////////////////////////////
///////////////////////
3.动态规划求组合
思想:C(n,k)=C(n-1,k-1)+C(n-1,k)
利用动态规划法,用一个二维数组把前面算出的组合数
保存起来,这样就不用重复对一个小的组合数算很多次
#include <iostream>
using namespace std;
const int N=6;
const int K=3;
int a[N+1][K+1]; //N+1 行,K+1 列的存储
int min(int x, int y) {
return x<y?x:y;
}
int Com(int n, int k) {
for(int i=0;i<=n;++i) {
for(int j=0;j<=min(i,k);++j) {
if (j==0 || j==i){//每行第 0 列(最左边,C(n,0)=1,主对角线元素也为 1)
a[i][j]=1;
} else {
a[i][j]=a[i-1][j-1]+a[i-1][j];//根据递推式
}
}
}
return a[n][k];
}
void main() {
cout<<"The combination value of (6,3) is "<<Com(N,K)<<endl;
}
////////////////////////////////////////////////////////////////////////////
///////////////////////
4.寻找发贴“水王”
1)题目
一个论坛中有一大“水王”,他不但喜欢发帖,还会回复其他 ID 发的每个帖子。
该“水王”发帖数目超过了总数的一半。如果你有一个当前论坛所有帖子(包括回
帖)的列表,其中帖子作者的 ID 也在表中,你能快速找出这个传说中的“水王”
吗?
2)分析
如果每次删除两个不同的 ID(不管是否包含“水王”的 ID),那么,在剩下的 ID
列表中,“水王”ID 出现的次数仍然超过总数的一半。看到这一点之后,就可以
通过不断重复这个过程,把 ID 列表中的 ID 总数降低(转化为更小的问题),
从而得到问题的答案。新的思路,总的时间复杂度只有 O(N),且只需要常数
的额外内存。
3)代码
#include<iostream>
using namespace std;
int Find(int* ID, int N) {
int candidate;
int nTimes=0;
int i;
for(i = 0; i < N; i++){
if(nTimes == 0){
candidate = ID[i];
nTimes = 1;
}else{
if(ID[i] == candidate)
nTimes++;
else
nTimes--;
}
}
return candidate;
}
int main(void){
int id[] = {1,2,2,4,2,4,2,2};
int iD = Find(id, 8);
cout<<"The water king's id is "<<iD<<endl;
return 0;
}
4)结论
在这个题目中,有一个计算机科学中很普遍的思想,就是如何把一个问题转化为规模较小的若干个问题。
分治、递推和贪心等都是基于这样的思路。在转化过程中,小的问题跟原问题本质上一致。
这样,我们可以通过同样的方式将小问题转化为更小的问题。因此,转化过程是很重要的。
像上面这个题目,我们保证了问题的解在小问题中仍然具有与原问题相同的性质:水王的 ID 在 ID 列表中
的次数超过一半。
转化本身计算的效率越高,转化之后问题规模缩小得越快,则整体算法的时间复杂度越低。
////////////////////////////////////////////////////////////////////////////
///////////////////////
5.求一个字符串中最长的重复子串,'0000……'不算在内
比如:"12334445000006"的最长子串是 444"
#include<stdio.h>
#include<string.h>
#include<malloc.h>
char* GetSubstring(char* strSource) {
char* strSubstring; //用于保存得到的子串,大小在找到最大子串后再确定,
作为返回值
int nLen; //源字符串长度
剩余38页未读,继续阅读
FelaniaLiu
- 粉丝: 22
- 资源: 334
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0