CrackingtheCodeInterview之中等难题

来源:互联网 发布:sql培训机构 编辑:程序博客网 时间:2024/04/29 10:22

NO.1 编写一个函数,不用临时变量,直接交换两个数。

解法:已知a,b,交换a和b,可以:a=a-b; b=b+a; a=b-a;

也可以:a^=b; b^=a; a^=b;

NO.2 设计一个算法,判断玩家是否赢了井字游戏。

解法1:井字游戏包含9个格子,每个格子的结果有3种情况,空、红和蓝,可以将每个格子 的情况表示为012,然后计算9个格子构成的3进制数,需要提前需处理计算每种情况的输赢情况。

解法2:针对每种情况,判断所有行所有列及所有对角线是否存在赢的情况。

NO.3 设计一个算法,算出n阶乘有多少个尾随零。

解法1:计算n阶乘,然后迭代result%10判断余数是否为0。

解法2:计算小于n的所有数中5的倍数、25的倍数、125的倍数的总个数,比如计算小于等于n的5的倍数的个数等于n/5,25的倍数等于n/25,。。。。因此建立一个循环乘5的循环即可。

NO.4 编写一个方法,找出两个数字中最大的那一个。不得使用if-else或其他比较运算符。

解法:计算a-b,然后右移31位即是其符号位,从而得到a-b为正还是为负,不过这种方法没考虑到a-b溢出的可能性,所以采用先判断a和b的正负,对于符号相反的就返回正数,对于符号相同的就计算a-b,不能使用if-else,所以只能作为一个权值去乘a或者b。

NO.5  珠玑妙算游戏,计算机有四个槽,每个槽放一个球,颜色可能为红色、黄色、绿色和蓝色。例如,计算机可能有RGGB四种,作为用户,你试图猜出颜色组合。打个比方,你可能会猜YRGB。要是猜对某个槽的颜色,则算一次“猜中”;要是只猜对颜色但槽位猜错了,则算一次“伪猜中”。注意,“猜中”不能算入“伪猜中”。举个例子,实际颜色组合为RGBY,而你猜的是GGRR,则算一次猜中,一次伪猜中。给定一个猜测和一种颜色组合,编写一个方法,返回猜中和伪猜中的次数。

解法:“猜中”的次数可以通过比较对齐的字符串上的对应字符来得出,“伪猜中”如何计算?首先统计guess字符串中每个颜色的个数,然后判断act字符串中与guess不同的且guess中的统计值每次减一。

NO.6  给定一个整数数组,编写一个函数,找出索引m和n,只要将m和n之间的元素排好序,整个数组就是有序的。注意,n-m越小越好,也就是说,找出符合条件的最短序列。

解法:从左往右判断数组是否为递增序列得到i标记,从右往左判断数组是否为递减序列得到j标记,遍历i到j之间的元素得到最大值和最小值,然后判断i之前的小于最小值的位置m,判断j之后的大于最大值的位置n。

NO.7  给定一个整数,打印该整数的英文描述(例如“One Thousand,Two Hundred Thirty Four”)。

解法:判断整数的位数,相应的调整即可。

NO.8  给定一个整数数组(有正数有负数),找出总和最大的连续数列,并返回总和。

解法:找出递归关系,Si表示包含i的左侧序列和最大值,则Si等于max(Si-1+Ai,Ai),然后遍历所有的Si找到最大的即可。

NO.9  设计一个方法,找出任意指定单词在一本书中的出现频率。

解法:若只查询一个单词,遍历统计一次即可,若查询多个单词,循环查找可以先建立一个multimap统计所有单词。

NO.10  XML非常冗长,你找到一种编码方式,可将每个标签对应为预先定义好的整数值。

解法:实现编码即可。

NO.11  给定rand5(),实现一个方法rand7()。

解法:((rand5())*5+rand5()去除21--24)%7

NO.12 设计一个算法,找出数组中两数之和为指定值的所有整数对。

解法1:遍历数组,针对每个元素,计算其补数,然后在数组后面搜索,若补数大于数组最大值就结束判断。

解法2:不求补数,任意匹配求sum ,进而判断是否为一对。


1 0