《Cracking the Coding Interview》——第17章:普通题——题目4

2014-04-28 22:32

题目:不用if语句或者比较运算符的情况下,实现max函数,返回两个数中更大的一个。

解法:每当碰见这种无聊的“不用XXX,给我XXX”型的题目,我都默认处理的是int类型。最高位是符号位,用x -
y的符号位来判断谁大谁小。请看下面代码,条件表达式配合异或运算能满足题目的要求。

代码:


 1 // 17.4 Find the maximum of two numbers without using comparison operator or if-else statement.
2 // Use bit operation instead. But this solution applies to integer only.
3 #include <cstdio>
4 using namespace std;
5
6 int mymax(int x, int y)
7 {
8 static const unsigned mask = 0x80000000;
9 return (x & mask) ^ (y & mask) ? ((x & mask) ? y : x) : ((x - y & mask) ? y : x);
10 }
11
12 int main()
13 {
14 int x, y;
15
16 while (scanf("%d%d", &x, &y) == 2) {
17 printf("%d\n", mymax(x, y));
18 }
19
20 return 0;
21 }

《Cracking the Coding Interview》——第17章:普通题——题目4,码迷,mamicode.com

时间: 2024-10-15 10:49:21

《Cracking the Coding Interview》——第17章:普通题——题目4的相关文章

《Cracking the Coding Interview》——第17章:普通题——题目13

2014-04-29 00:15 题目:将二叉搜索树展开成一个双向链表,要求这个链表仍是有序的,而且不能另外分配对象,就地完成. 解法:Leetcode上也有,递归解法. 代码: 1 // 17.13 Flatten a binary search tree into a doubly linked list by inorder traversal order. 2 // Use postorder traversal to do the flattening job. 3 #include

《Cracking the Coding Interview》——第17章:普通题——题目14

2014-04-29 00:20 题目:给定一个长字符串,和一个词典.如果允许你将长串分割成若干个片段,可能会存在某些片段在词典里查不到,有些则查得到.请设计算法进行分词,使得查不到的片段个数最少. 解法:用空间换取时间的动态规划算法,首先用O(n^2)的时间判断每一个片段是否在字典里.这个过程其实可以通过字典树来进行加速,时间上能优化一个阶,不过我没写,偷懒用<unordered_set>代表了字典.之后通过O(n)时间的动态规划,dp[i]表示当前位置的查不到的片段的最少个数.对于懂代码的

《Cracking the Coding Interview》——第17章:普通题——题目12

2014-04-29 00:04 题目:给定一个整数数组,找出所有加起来为指定和的数对. 解法1:可以用哈希表保存数组元素,做到O(n)时间的算法. 代码: 1 // 17.12 Given an array of integers and target value, find all pairs in the array that sum up to the target. 2 // Use hash to achieve O(n) time complexity. Duplicates pa

《Cracking the Coding Interview》——第17章:普通题——题目10

2014-04-28 23:54 题目:XML文件的冗余度很大,主要在于尖括号里的字段名.按照书上给定的方式进行压缩. 解法:这题我居然忘做了,只写了一句话的注解.用python能够相对方便地实现,因为有直接的XML工具可以调用.书上的那种要求应该是符合前序遍历规则. 代码: 1 # 17.10 Parse an XML file, and try to save some space by mapping every item name to an integer index. 2 # Ans

《Cracking the Coding Interview》——第17章:普通题——题目7

2014-04-28 23:28 题目:给定一个数字,用英语把它读出来. 解法:ZOJ上有相反的题目.如果我要用中文读书来呢? 代码: 1 // 17.7 Read an integer in English. 2 #include <map> 3 #include <string> 4 using namespace std; 5 6 map<int, string> m; 7 8 void init() 9 { 10 m[0] = "zero";

《Cracking the Coding Interview》——第17章:普通题——题目9

2014-04-28 23:52 题目:设计算法,找出一本书中某个单词的出现频率. 解法:数就行了. 代码: 1 // 17.9 Given a book, find out the occurrences of any given words in it. 2 // Answer: 3 // 1. process the book as a text file. 4 // 2. find all words, definition of a word must be clearly asser

《Cracking the Coding Interview》——第17章:普通题——题目6

2014-04-28 22:49 题目:给定一个整数数组.如果你将其中一个子数组排序,那么整个数组都变得有序.找出所有这样子数组里最短的一个. 解法:线性时间,常数空间内可以解决,思想类似于动态规划.通过正反扫描两次,可以得出这个区间的两端.只要存在i < j并且a[i] > a[j],那么这个区间[i, j]就必须被排序,为了在线性时间内完成算法,我们可以通过不断比较当前元素与当前最大(最小)元素来更新结果.请看代码. 代码: 1 // 17.6 Given an array, if you

《Cracking the Coding Interview》——第17章:普通题——题目8

2014-04-28 23:35 题目:最大子数组和问题. 解法:O(n)解法. 代码: 1 // 17.8 Find the consecutive subarray with maximum sum in an array. 2 // O(n) online algorithm. 3 #include <cstdio> 4 #include <vector> 5 using namespace std; 6 7 int maximumSum(vector<int>

《Cracking the Coding Interview》——第17章:普通题——题目5

2014-04-28 22:44 题目:猜数字游戏.四个数字,每个都是0~9之间.你每猜一次,我都告诉你,有多少个位置和数字都对(全对),有多少个位置错数字对(半对).比如"6309",你猜"3701",就有1全对,1半对. 解法:依照题意写就可以了. 代码: 1 // 17.5 I am the Master Mind. Guess the number. 2 // When you guessed the right number at the right po

《Cracking the Coding Interview》——第17章:普通题——题目1

2014-04-28 21:45 题目:就地交换两个数,不使用额外的变量. 解法:没说是整数,我姑且先当整数处理吧.就地交换可以用加法.乘法.异或完成,其中乘法和加法都存在溢出问题.三种方法都不能处理交换同一个数的情况,需要条件判断. 代码: 1 // 17.1 Do a swapping in-place. 2 #include <cstdio> 3 using namespace std; 4 5 void swap1(int &x, int &y) 6 { 7 if (x