常见面试题学习(3)
来源于:
http://blog.csdn.net/lin_bei/article/details/1565575
1. 中位数,也是利用2分查找,去掉一半的算法,只是这个 中位数 。。。。总是求的是最小的那个,而不是平均值。。。
Gray 码,使用递归分治求GRAY码
硬币找零问题
#include <iostream>
using namespace std;
int findMedian(int *a,int *b,int n)
{
if(n == 1)
return *a <= *b ? *a: *b;
int m = (n - 1) >> 1;
int p = m + 1;
if(n % 2 != 0)//n 为奇数
{
p --;
}
if(*(a + m) == *(b + m))
{
return *(a + m);
}
else if(*(a + m) < *(b + m))
{
return findMedian(a+p,b,m + 1);
}
else
{
return findMedian(a,b + p,m +1);
}
}
int main()
{
int a[3] = {5,15,18};
int b[3] = {3,14,21};
int result = findMedian(a,b,3);
cout << result << endl;
return 0;
}
2. Gray 码,使用递归分治求GRAY码
http://topic.csdn.net/u/20080331/21/aabec9b7-a617-432a-9ada-a6d0823fd047.html
#include <iostream>
#include <iterator>
#include <algorithm>
using namespace std;
int *Road;
void R_Gray( int, int );
void Gray( int n, int level ){
if( level==0 ){
copy( Road, Road+n, ostream_iterator<int>(cout) ),cout<<endl;
return;
}
Road[n-level]=0;
Gray( n, level-1 );
Road[n-level]=1;
R_Gray( n, level-1 );
}
void R_Gray( int n, int level ){
if( level==0 ){
copy( Road, Road+n, ostream_iterator<int>(cout) ),cout<<endl;
return;
}
Road[n-level]=1;
Gray( n, level-1 );
Road[n-level]=0;
R_Gray( n, level-1 );
}
int main()
{
int n;
cin>>n;
Road=new int[n];
Gray( n, n );
delete []Road;
return 0;
}
还有非递归的
#include <iostream>
using namespace std;
void print_bit_model( int len, int n ){
for( int i=len-1; i>=0; --i )
cout<<((n>>i)&1);
cout<<endl;
}
int main()
{
int n;
cin>>n;
const int M=1<<n;
for( int i=0; i<M; ++i )
print_bit_model( n, i^(i>>1) );
return 0;
}
3. 硬币找零问题
动态规划
#include <fstream>
#include <iostream>
#include <algorithm>
using namespace std;
#define INT_MAX 999999
int changeCoins(int *T, int n, int v);
int main()
{
int n;
int v = 10000;
cin>>n;
int *T=new int[n];
for(int i=0;i<n;i++)
{
cin>>T[i];
}
int result=changeCoins(T,n,v);
cout<<result<<endl;
return 0;
}
int changeCoins(int *T, int n, int v)
{
//先对3个硬币按面值进行排序
sort(T,T+n);
int **c=new int*[n];
for(int m=0;m<n;m++){
c[m]=new int[v+1];
}
//初始化第一行,只有一个硬币时的情况
for(int i=0;i<=v;i++)
if(i%T[0]==0)
c[0][i]=i/T[0];
else
c[0][i]=INT_MAX;
//从第二行开始
for(int j=1;j<n;j++)
for(int k=0;k<=v;k++)
//新加进来的硬币大于要找的钱,用不到这个硬币,所以还是跟上一行的一样
if(k<T[j])
c[j][k]=c[j-1][k];
else
c[j][k]=c[j-1][k]<c[j][k-T[j]]+1?c[j-1][k]:c[j][k-T[j]]+1;
return c[n-1][v];
delete[] c;
}
一个不会敲代码的程序员
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述