编程之美代码
A. 编程之美一道思考题的延伸,求解答,c语言代码或算法均可
背包算法。
B. 关于编程之美1.1节中让CPU占用率呈正弦曲线的一个问题
的出租市场vjksdZNFckjlsDNBzjknvjks
C. 利用两个栈S1和S2来模拟一个队列.若不存在栈溢出问题,则请写出用栈的操作来实现队列的插入和删除的算法.
使用两个栈,分别依元素加入的顺序和其反序保存元素,在适当的时机将元素在两个栈中进行转移,从而模拟队列的操作。
令S1中元素的顺序为自底向上与元素添加顺序一致,S2与其相反,则:
加入队列时,若S2不空,则将S2中的元素依次出栈,每出栈一个向S1中入栈一个;将入队元素入S1栈;
从队列中取出时,若S1不空,则将S1中元素依次出栈,每出栈一个向S2中入栈一个;从S2栈顶出栈一个即队列中取出的元素。
用伪代码描述如下:
Enqueue(elem)
while(!S2.empty())
temp = S2.pop();
S1.push(temp);
S1.push(elem);
Dequeue()
while(!S1.empty())
temp = S1.pop();
S2.push(temp);
return S2.pop();
D. 编程之美 好还是剑指offer好
编程之美 好还是剑指offer好
1.13.8 Options菜单
按Alt+O可进入Options菜单, 该菜单对初学者来说要谨慎使用,该菜单有以下几个内容,如图所示:
1. Compiler:本项选择又有许多子菜单, 可以让用户选择硬件配置、存储模型、调试技术、 代码优化、对话信息控制和宏定义。这些子菜单如图所示:
1) Model:共有Tiny, small, medium, compact, large, huge 六种不同模式可由同户选 择。
2) Define:打开一个宏定义框, 同户可输入宏定义。多重定义可同分号, 赋值可用等号。
3) Code generation:它又有许多任选项, 这些任选项告诉编译器产生什么样的目标代码。
? Calling convention 可选择C或Pascal方式传递参数。
? Instruction set 可选择8088/8086或80186/80286指令系列。
? Floating point 可选择仿真浮点、数学协处理器浮点或无浮点运算。
? Default char type 规定char的类型。
? Alignonent 规定地址对准原则。
E. 微软的编程之美应该做哪些准备
微软的官方网站上写着"我们期待具有独创性、开拓性的智者加入队伍,我们的面试程序也是为网罗这样的人才专门设计。"
听似简单。但无数被微软拒之门外的哈佛博士、麻省理工精英会告诉你,微软的面试题有多"BT"。这些被称为"恶魔试题"的考题千奇百怪,无所不有。
究竟应试者需要多高的IQ、多么完备的逻辑思维,才能打动比尔·盖茨,加入他的豪华办公楼?
最近,美国作家威廉·庞德斯撰写新书《如何搬动富士山———微软的面试难题》,揭开"微软问题"的真面孔。
光聪明没用
微软公司的招聘信箱,每个月会收到1.2万份简历。如果用A4纸打印出来,能堆得比姚明还高。
不过,微软HR们并不担心加班工作,他们有比人工筛选更高效的"秘密武器"———计算机核对搜索。每封按规格投递给微软的电子简历,会经由特定程序搜索关键词,然后录入数据库。计算机"认为"有前景的简历,HR才给应聘者一个电话应答的机会。
两轮筛选出的"胜利者"能收到一张来往华盛顿州雷蒙德的微软总部的机票。打包好头脑,准备接受"眼高于顶"的面试官们一整天超高难度的"马拉松"面试吧!
"为什么啤酒罐的两端要做成凹形设计?"
"你要怎么制造M&Ms巧克力?"
"芝加哥全体大学生的体重总和是多少?"
听到这些问题少皱眉头,它们都是微软面试最典型也最小儿科的"一星级题库"。通不过这类测试,别说微软,硅谷中的其他计算机企业都不会"接收"你。
其实,早在20年前,微软还未曾开创、硅谷还是群雄争霸时,就开始流行用这些"扯淡"考题招聘。因为计算机产业的快速变动和创新,许多企业发现,光测试应聘者的IQ远远不够,高分IQ员工往往光有一副聪明脑袋,爱说不能做。
于是,老板们开始寻求可以考查"全方位解决能力"的招聘题目,"读取"应聘者逻辑思维能力、想象力和解决问题的能力"指数"。这就是"怪考题"的老祖宗们。
为比尔设计浴室
如今,在"巨无霸"微软的推动下,这类考题愈出愈冷僻。
来看看最近比尔·盖茨最中意的考题———为他设计一个浴室。
很异想天开?可以随便回答?这么想的话你铁定无法通过微软面试!用心分析题目,应试者可以得出2个答题关键———一是要考虑符合比尔·盖茨身份、职业、性格的浴室设计方案;二是至少要提出一些让比尔·盖茨欣赏但他自己却从未想到过的设计理念。否则,比尔·盖茨干吗雇你为他设计浴室?
被微软接受的合理设计理念于是诞生了。
能够自动上锁的智能医药箱:用来存放家用药品,以便无大人陪伴的孩子进入浴室、偶遇意外时能够得到及时救治。
自动记事本:在浴室里产生奇思妙想,却又因为手湿,无法使用PDA。那么,或许比尔·盖茨需要一个声音识别设备,当他说出诸如"比尔的备忘录"等代码后,设备可以录下信息,并自动将信息发送到电子邮箱,以备随时取用。
一面物像非对称的镜子:镜子背后安装了视频屏幕,屏幕连接着四周围隐蔽的摄像机。这样,站在镜子面前,你能轻易看到你的背面图像和侧面图像,穿衣服、剪头发或者挤掉背后的暗疮就方便多了。
"面临不确定时的行动力"而非"想象力",才是微软设计这道考题的真正目的。
答对了未必得分
更令人抓狂的是:有时,应试者即使给出了题目的正确答案,却依旧无法得分。
比如"地球上有多少这样的点:你先朝南走一公里,再向东一公里,再向北1公里,这时你回到了你的起点上。"
首先你想,这不是四方形少了一个边吗?回到起点简直不可能!
然后,很快想到"极点"这个特殊地点———从北极点出发,任何方向都是南。于是从北极点出发,向三个方向分别走一公里,回到极点。于是你庆幸自己找到了答案,而且是惟一的答案。因为这样的事情在南极点上不能发生,南极点已经不能再向南了。
考官面无表情,在你的答卷上批下"汤团"一个,你和回答"没有这个点"的朋友们站在同一个叫做"淘汰"的阵营。
答案的关键正是在南极点上。
假定你站在离开南极点一公里多一些的地方走向南极。走完向南的一公里后,你还未曾达到南极点,但已经非常接近。于是你继续向东,因为实在离南极点太近,你发现不断向东走的路线形成了一个以南极为圆心,与赤道平行的圆,它的周长刚好一公里。这样一来,你回到了圆形的出发点。往北一公里后,你回到原点。这样一来,答题的点增加到了无数。
完了吗?并没有,你还可以增加一些点,比如,那个圆形的周长恰好是1/2公里、1/4公里、1/8公里......
只有回答出后面两类答案的人,才有资格被微软留下来
精简修改过的Windows XP普遍删除了
F. C#注重编程之美,代码的优雅,总结几个平常
关于这个问题,刚开始我也是啊,几乎都看不懂,到了最后我才明白,原来这本书是给有编程基础的人看的,所以,现在我就冲着一门编程语言来学习,我学的是C语言,先学习基础的知识,然后再根据网上的实例去自己写出来作品,比如小的计算器,还有小的播放器,......写这些东西的时候,用到了好多的知识,最后我再拿起编程之美来看,才发现有点眉目了,呵呵呵.....学习是一点一点的进行的,特别是编程,不要急于求成。我问过熊猫烧香的制作者李俊,他就跟我说,不要急,一点一点的来........祝你好运,呵呵....希望我的回答能够帮到你.....
G. 《编程之美》里的代码是什么语言写的 大部分是c语言吗
大部分都是C语言,如果你有不懂的地方,可以直接到网上搜索书中章节的标题,网上有很多人讨论的,可以从别人那里获取新的方法.另外书中有些方式可能已经过时了,或者不是最优解.就比如第一篇让CPU占用率曲线听你指挥,其实对于多核已经不太适用了.但网上的人也有改进的程序.
H. 电子版的 代码大全或者编程之美
I. 求不连续子数组最大和的值
这是一道典型的动态规划问题,书中循序渐进地通过分析给出了一个时间复杂度为O(N)空间复杂度为O(1)的最优解。我在面试时碰到了这道题的一道有趣变体,即同样给定一个数组,写一个在其中找出不连续子数组和的最大值,也就是说子数组里的任意相邻的两个元素,在原数组里都必须是不相邻的才行。同样以数组{1, -2, 3, 5, -1, 2}为例,则和最大的不连续子数组是{1, 5, 2},函数返回值是8。
显然,最直接的思路我们可以采用穷举法,对于此类寻找符合条件的子数组的问题,无非就是对原数组上每位元素是否属于子数组做一次遍历判断。由于每位元素都有属于和不属于子数组两种可能性,那么穷举的时间复杂度为O(2^N)。即使考虑“不连续”这个限制条件,即某位元素被选中属于子数组后,则其相邻元素就一定不能被选中,也对时间复杂度的数量级不会有太多影响。因此很明显,这绝对是个愚蠢的答案……
从《编程之美》一题中得到启发,我们是不是也可以用动态规划的方法来解这道题呢?假设从原数组a第i位开始的最大不连续子数组和为m[ i ],那么它的值有两种可能,一种是当前元素a[ i ]与隔一位上子问题解m[ i+2 ]之和(由不连续性质决定),另一种是不包含当前元素而直接等于前一位上子问题解m[ i+1 ],那么我们可以写出递推公式为:m[ i ] = max(a[ i ] + m[ i+2 ], m[ i+1 ])。
等等,也许你要说,好像这个递推式有漏洞啊,因为前一位上的解m[ i+1 ]本身就有可能是包含或不包含a[ i+1 ],假如m[ i+1 ]不包含a[ i+1 ],那么岂不是还要考虑a[ i ]+m[ i+1 ]这种可能性呢?
这个递推式真的经不起推敲吗?我们不妨重新整理一下思路:由于原数组上每一元素都有取与不取两种可能,那么也就对应有包含和不包含该元素的两个子数组的最大和。对于原数组a中第i位上的元素,假设包含a[ i ]元素的子数组最大和为s[ i ],而不包含元素a[ i ]的子数组最大和为ns[ i ],因此所要求的不连续子数组最大和m[ i ] = max(s[ i ], ns[ i ])。那么根据题意我们可以整理出递推关系如下:
s[ i ] = max(a[ i ] + ns[ i+1 ], a[ i ] + m[ i+2 ])
ns[ i ] = m[ i+1 ]
m[ i ] = max(a[ i ] + ns[ i+1 ], a[ i ] + m[ i+2 ], m[ i+1 ])
有趣的地方在于ns[ i ] = m[ i+1 ]这一项上,根据它我们可以得到ns[ i+1 ] = m(i+2),也就是说假如m[ i+1 ]不包含a[ i+1 ]的话,那么它一定等于m[ i+2 ],所以a[ i ]+ns[ i+1 ]等价于a[ i ] + m[ i+2 ],递推式m[ i ] = max(a[ i ] + m[ i+2 ], m[ i+1 ])是正确的!
从《编程之美》给出的解法中得到启发,我们也只需要使用两个变量来记录m[ i+2 ]和m[ i+1 ]的值就行了,而且同样只需要O(N)的复杂度就可以解这道题,代码如下:
int maxsum(int* a, int n)
{
int m2 = 0;
int m1 = a[ n-1 ];
for(int i = n - 2; i >= 0; i--)
{
if(m2 < 0) m2 = 0; //处理最后一位为负数或全为负数的情况
int tmp = m1;
m1 = max(a[ i ] + m2, m1);
m2 = tmp;
}
return m1;
}
我的做法:
s[0]=a[0]
s[1]=max{a[0],a[1]}
s[i]=max{s[i-1],s[i-2]+a[i]}, i>=2
int maxSum(int a[],int n){
assert(n>0);
if(n==1)
return a[0];
if(n==2)
return max(a[0],a[1]);
int* s=new int[n];
s[0]=a[0];
s[1]=max(a[0],a[1]);
for(int i=2;i<n;i++){
s[i]=max(s[i-1],s[i-2]+a[i]);
}
int ms=INT_MIN;
for(int i=0;i<n;i++){
if(s[i]>ms)
ms=s[i];
}
delete []s;
return ms;
}