看到了别人上传的一份BUPT的面试算法题目。
1、求解0-9999中,数字7出现的次数。(77算两次)
分析:1000*4=4000个。
其实你就分析每一位出现数字7的个数即可。
拓展:0-9999中,数字0出现的次数。
答:1000+990+900次。
2、求解一个数组的中位数。
分析:sort时间复杂度
O
(
n
l
o
g
n
)
O(nlogn)
O(nlogn),排序,输出中间的数。
#include<bits/stdc++.h>
#define maxn 100010
using namespace std;
typedef long long ll;
ll n,a[maxn];
int main(){
std::ios::sync_with_stdio(false);
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
sort(a,a+pos);
cout<<a[(n-1)/2]<<endl;
return 0;
}
3、求解最大连续字串和。
分析:DP问题,
d
p
[
i
]
=
m
a
x
(
a
[
i
]
,
d
p
[
i
−
1
]
+
a
[
i
]
)
dp[i]=max(a[i],dp[i-1]+a[i])
dp[i]=max(a[i],dp[i−1]+a[i])。
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
#define maxn 100010
using namespace std;
typedef long long ll;
int n,a[maxn],dp[maxn],maxx=-inf;
int main(){
std::ios::sync_with_stdio(false);
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
dp[i]=max(a[i],dp[i-1]+a[i]);
maxx=max(dp[i],maxx);
}
cout<<maxx<<endl;
return 0;
}
4、字符串最长公共前缀
#include<bits/stdc++.h>
#define maxn 100010
using namespace std;
string s[maxn];
int n,ans=0;
bool flag=false;
int main(){
std::ios::sync_with_stdio(false);
cin>>n;
for(int i=0;i<n;i++){
cin>>s[i];
}
int len=0;
for(int i=0;i<s[0].length();i++){
char ch=s[0][i];
for(int j=1;j<n;j++){
if(s[j][i]!=ch||i+1>s[j].length()){flag=true;break;}
}
if(flag){break;}
len++;
}
if(len!=0) {cout<<len<<endl;}
return 0;
}