循环与数组问题
以下代码的输出结果是什么?[中国著名金融企业J银行2008年面试题]
A.10,0,9,1
B.10,10,9,0
C.10,1,9,2
D.9,10,8,0
解析:for循环括号内被两个分号分为3部分:i=0是初始化变量;x>8是循环条件,也就
是只要x>8就执行循环;那y=i++是什么?在第一次循环时执行了么?答案是不执
行,y=i++实际上是个递增条件,仅在第二次循环开始时才执行。所以结果是10,10,9,0。
务必要搞清楚下面程序和题目的不同点:
与题目不同,y=i++在循环体内,而不作为递增条件,所以在第一次循环就执行了,所
以输出结果是10,0,9,1。
答案:B
-------------------------------------------------------------------------------------------------------------------------------------------
有两等长数组A、B,所含元素相同,但顺序不同,只能取得A数组某值和B数
组某值进行比较,比较结果为大于、小于或等于,但是不能取得同一数组A或B中的两个数
进行比较,也不能取得某数组中的某个值。写一个算法实现正确匹配(即A数组中某值与B
中某值等值)。[英国著名图形图像公司A 2007年4月校园招聘面试题]
解析:算法:循环加判断可以很快地解决这个问题。算法分析:假设两个数组
A[10]、B[10]。将A.0与B.0进行比较,判断它们是否等值或大于、小于,如果等值则
打印出来,不等则比较B.1……依次类推。
答案:
代码如下:
我们这里用的循环加比较的算法可以很快地解决这个问题,但却并不是最优算法。如果笔试时间充足的话,我们可以
对算法做某些优化。
建立一个结构数组C,结构为{某数在B中的位置,标记,某数在A中的位置}。其中“标记”可为大于、小于、等于。“某
数在A/B中的位置”为0~n-1,这是相应位置。第一次比较后,C中元素都为{某数在B中的位置,标记,A0}格式。然后执
行如下步骤:
(1)在A数组中随机选取一个数(根据题意,我们并不知道这个值的确定值是多少),比如说A[i],然后和B数组中
的数进行比较。根据数据结构C,将B数组中每个数与A[i]进行比较,若比A[i]大,从后向前存储,比A[i]小则从前向
后存储,要是等于A[i],就记录下这个值在B的位置j。继续比较,直到B数组中的数全部比较完成,然后再把这个b[j]
插入空余的那个中间位置。
(2)然后再从A数组中取出数A[k]{k=0~n}与B[j](这个B[j]就是A[i],因为同一数组中不能比较大小,只
能采用这种方式)比较,若比B[j]大,那么从结构数组C中A[i]后面比较,若比B[j]小,就从结构数组C中A[i]前面
比较,直到找到相等的为止,然后更新结构数组C中与这个相等的相应值。注意,在这里,只更新相等的那个数值的“标
记”,其他与A[k]不相同(或大,或小)的情况下不更新,即还保持A[i]的比较结果,以利于下一次进行比较。
(3)重复步骤(2),继续取A数组剩下的值,仍然与那个B[j]比较,这样逐步更新结构数组C,直到A数组全部取
出比较完,那么这个程序也就完成了相应的功能。
这里用到了快速排序和二分法的某些思想。选择合理的A[i],可以大大降低比较次数。