posts - 115,  comments - 293,  trackbacks - 0

好久不写技术贴了,决定换一下思维,写个算法相关的。

最近面试的时候,很喜欢问两个算法问题。
问题1:阿拉伯数字的金额转换为中国传统的汉字形式。
问题2:不增加变量,交换两个数值变量的值。

先说问题2,因为问题2最简单。
        很显然,要想不增加变量,交换两个变量的值,只可能做加减乘除运算。用对应的加减法或者乘除法都可以做到。举例:a=5;b=8。
      加减: a=a+b=5+8=13;b=a-b=13-8=5;a=a-b=13-5=8;
                  a=a-b=5-8=-3;b=a+b=-3+8=5;a=b-a=5-(-3)=8;
   同理,乘除。
我觉得此题主要是考一个人的思维。但是面试的人,大部分都不会做。

再说问题1:还是大部分人不会做。现提供本人思路如下:
       分析问题:a、小数点之前为整数,小数点后只有两位,为角分。
                           b、小数点之前个位单位为元,依次为元,十,百,千,万,十万,百万,千万,亿……
                           c、每位的数字对应为:零、壹、贰、叁、肂、伍、陆、柒、捌、镹。
                          d、在操作中,数值运算和数组操作性能最快。
       思路:a、用两个数组,array1[10]、array2[]按下标为0、1、……的顺序分别存储零、壹、贰、叁、肂、伍、陆、柒、捌、镹。和元,十,百,千,万,十万,百万,千万,亿……
                  b、针对整数部分,从十开始除,余数转换为汉字,取对应余数值得数组array1[余数]所对应的值。取得到的商,并记录除的次数。次数对应为array[次数]的汉字。拼接。
                  c、反复第二步,直道商为0。
                  d、其中余位为0时特殊处理。
                  e、小数点后统一处理两次。不做讲述。
      举例:234.12。整数为234。
                 234/10  商23 余4  除次数为0  array1[4]+array2[0]=肆元
                 23/10    商2   余3  除次数为1  array1[3]+array2[1]=叁拾
                 2/10      商0   余2  除次数为2  array1[2]+array2[2]=贰佰
      合起来就是贰佰叁拾肆元。
        此题考的是拿到问题后的分析思路和基本功。可能每个人的实现方法不一样。可能是紧张吧,面试的时候,大部分人都答不出来。

posted on 2008-07-11 15:39 coffee 阅读(2446) 评论(30)  编辑  收藏 所属分类: 技术随笔

FeedBack:
# re: 面试的时候爱问的两道题[未登录]
2008-07-11 15:49 | destiny
这问题真的很恶心啊!  回复  更多评论
  
# re: 面试的时候爱问的两道题[未登录]
2008-07-11 16:26 | dennis
确实比较无语的题目,考这样题目的公司没啥意思。第二道题可以用位运算符
a = a ^ b;
b = a ^ b;
a = a ^ b;

  回复  更多评论
  
# re: 面试的时候爱问的两道题
2008-07-11 16:43 | yeshucheng
这题目有点意思,稍微BT点  回复  更多评论
  
# re: 面试的时候爱问的两道题[未登录]
2008-07-11 17:31 | 1
没意思,最看不上这样的面试题  回复  更多评论
  
# re: 面试的时候爱问的两道题
2008-07-11 17:45 | 我是游客
第二题根本就不是考思维,而是考知识面,只要见到过这个题目的人5秒钟就做出来,个人觉得这种面试题比较没有意义  回复  更多评论
  
# re: 面试的时候爱问的两道题
2008-07-11 18:57 | tangfl
严格来说,对第二题的答案是有问题的:
如果 &a == &b ,则得出的结论是错误的!  回复  更多评论
  
# re: 面试的时候爱问的两道题
2008-07-11 19:56 | lizongbo

第二题用加减乘除 都可能出现数值溢出的。
只有位运算才是可靠的。

  回复  更多评论
  
# re: 面试的时候爱问的两道题
2008-07-11 21:32 | YYX
@tangfl
java基本类型变量不可能地址相同的


还有Q1么,用toString 然后对每位都Integer.parse就得倒String[]的索引啦,效率虽然不高但是根本不需要动脑  回复  更多评论
  
# re: 面试的时候爱问的两道题
2008-07-11 23:31 | ZelluX
我小学参加一个市级编程比赛的时候就考了第一题。。。

第二题分情况吧,如果是浮点还不能直接进行异或操作,而用加减法的话会产生误差。  回复  更多评论
  
# re: 面试的时候爱问的两道题
2008-07-11 23:59 | coffee
其实面试,考题的答案并不重要。重要的是你有无解决问题的思路。
考你解决问题的条理性,考你拿到问题的态度。  回复  更多评论
  
# re: 面试的时候爱问的两道题
2008-07-12 00:00 | coffee
发现还是技术问题被人关注,其它的都无人问津。  回复  更多评论
  
# re: 面试的时候爱问的两道题[未登录]
2008-07-12 08:46 | Matthew
302这样的数值应该算是三百零二吧。  回复  更多评论
  
# re: 面试的时候爱问的两道题
2008-07-12 09:30 | yeshucheng
所以LZ关注管理方面的同时还是不忘技术的热点,更加是基础型问题。

PS:你的第二题目确实如果采用加减法,先求和然后取反数赋值在一定范围会产生溢出。有位朋友说采用位运算最可靠,这个支持。  回复  更多评论
  
# re: 面试的时候爱问的两道题
2008-07-12 10:31 | cold
挺简单的,稍一思索就知道了,可惜偶只会c,没人要偶  回复  更多评论
  
# re: 面试的时候爱问的两道题
2008-07-12 10:45 | @beyondwcm
呵呵,第二个问题在学软件工程是遇见过。  回复  更多评论
  
# re: 面试的时候爱问的两道题
2008-07-12 10:53 | 大梅沙云顶天海会所
遇见过  回复  更多评论
  
# re: 面试的时候爱问的两道题
2008-07-12 21:16 | coffee
@yeshucheng
呵呵,我是比较强调基础的。这两个问题其实都是很简单的,学数据结构的时候都碰到过。  回复  更多评论
  
# re: 面试的时候爱问的两道题
2008-07-12 21:18 | coffee
如果能考虑到溢出,我会给面试的加分。如果回答不会,会减很多分。  回复  更多评论
  
# re: 面试的时候爱问的两道题
2008-07-12 21:37 | ZelluX
@coffee
看来你当面试官不合格,计算机整数加法构成一个交换群。或者说即使溢出了结果还是正确的。  回复  更多评论
  
# re: 面试的时候爱问的两道题
2008-07-12 23:30 | 路过
我才学,没有看法  回复  更多评论
  
# re: 面试的时候爱问的两道题
2008-07-13 07:28 | yeshucheng
其实面试有时候也要懂得“不轻言放弃”,一个题目无论曾经有没有碰到过,最好还是要经过自己思考。开篇就说:不会。我想这个也不是做IT人的精神  回复  更多评论
  
# re: 面试的时候爱问的两道题[未登录]
2008-07-13 07:54 | zxbyh
上大学的时候,编译原理老师就出了这个题,不增加变量,交换两个数值变量的值
他说是他们当年为了节省内存空间,想出来的办法.
  回复  更多评论
  
# re: 面试的时候爱问的两道题
2008-07-13 11:23 | 洗桑拿的螃蟹
这题不知道,您给时限了没有,120,100 这个数按你的算法出来好象是壹拾万贰万壹佰,而实际用是应当是壹拾贰万零壹佰元,对你给出的变换结果的不同理解,会让工作量大大不同,你如果是面试程序员的话,我想说,做为面试题对变换规则解释的不够明确,这加大了程序员出错的可能性.  回复  更多评论
  
# re: 面试的时候爱问的两道题
2008-07-14 00:00 | 三人行,必有我师焉
如果面试的时候碰到这种题目,这种公司不进也罢,反正也对不上自己的胃口,这年头,除了公司面人,也要人面公司。去了自己不喜欢的公司,何苦呢?喜欢围绕着自己强项的面试的公司,能把自己的特点发挥出来,以后进了公司一样能发挥自己的能力。  回复  更多评论
  
# re: 面试的时候爱问的两道题
2008-07-14 08:50 | coffee
其实这两道题是笔试题上的,每次都是看到面试者没有答这两道题,才问的。

此外,这两个题,第一题主要是考思维能力,第二个题是考一个人的解决问题的思路。至于是否能考虑到溢出等完备性,个人认为在很短的时间内,这不是考核的重点。思路的清晰度,条理性,逻辑性才是重点。当然能说出类似溢出,精确性等问题,那是能体现这个人思维的缜密性的。  回复  更多评论
  
# re: 面试的时候爱问的两道题
2008-07-14 08:58 | coffee
@三人行,必有我师焉
呵呵,关于您所说的强项说法,请参见我的《以不变应万变》。个人始终认为,扎实的基础,对自己研究的主题知其然,还知其所以然才是真的强项。如果我去一个新公司,我往往是希望自己的强项得到机会,弱项得到加强。否则可能会停滞不前。  回复  更多评论
  
# re: 面试的时候爱问的两道题
2008-07-14 14:55 | InPractice
关于不用临时变量交换两个数,楼主提供的算法固然精巧,但是性能未必好。很可能需要更多的指令来执行。  回复  更多评论
  
# re: 面试的时候爱问的两道题
2008-07-15 15:38 | zm
这是招应届毕业生吧,真bt  回复  更多评论
  
# re: 面试的时候爱问的两道题
2008-08-04 10:07 | 偏激了
@yeshucheng
把自己当成真理的制造者了吧!

其实面试有时候也要懂得“不轻言放弃”,一个题目无论曾经有没有碰到过,最好还是要经过自己思考。开篇就说:不会。我想这个也不是做IT人的精神



不要以为自己怎么样了,就可以轻易断定什么人就无为了!你调查过吗?有事实吗?  回复  更多评论
  
# re: 面试的时候爱问的两道题
2008-08-04 23:58 | mage
@偏激了
这哥们说得有理,每个人都是不可否认的.
每个都是有遗漏的~  回复  更多评论
  

标题  
姓名  
主页
验证码 *  
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
 
 

推荐图书:
走出软件作坊》、《悟透JavaScript》、《Head First 设计模式
相关链接:
网站导航:
<2008年7月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

棱而无角,圆而有方,我永远的追求。

常用链接

留言簿(11)

随笔分类(98)

随笔档案(114)

文章分类(3)

相册

收藏夹

java

其它

最新随笔

搜索

  •  

积分与排名

  • 积分 - 44483
  • 排名 - 229

最新评论

阅读排行榜

评论排行榜