中等难题

17.1 编写一个函数,不用临时变量,直接交换两个数。(第 104 页)

a = a - b; // a = 9 - 4 = 5 
b = a + b; // b = 5 + 4 = 9 
a = b - a; // a = 9 - 5

位操作
a = a^b; // a = 101^110 = 011
b = a^b; // b = 011^110 = 101 
a = a^b; // a = 011^101 = 110

17.3 设计一个算法,算出n阶乘有多少个尾随零。(第 104 页)

10倍数就会形成尾随零,而10倍数又可分解为一组组5倍数和2倍数。

不过,2倍数始终要比5倍数 多,最后只要数出5倍数就可以了。


17.4 编写一个方法,找出两个数字中最大的那一个。不得使用if-else或其他比较运算符。 (第 104 页)

可以使用乘法

???


17.6 给定一个整数数组,编写一个函数,找出索引m和n,只要将m和n之间的元素排好 序,整个数组就是有序的。注意:n  m越小越好,也就是说,找出符合条件的最短序列。(第 104 页)```

/* 找出左子序列 */
/* 找出右子序列 *
/* 找出中间部分的最小值和最大值 */
/* 向左移动,直到小于array[min_index] */
/* 向右移动,直到大于array[max_index] */

17.7 给定一个整数, 打印该整数的英文描述(例如“One Thousand, Two Hundred-Thirty Four”)。(第 104 页)

17.8 给定一个整数数组(有正数有负数),找出总和最大的连续数列,并返回总和。(第 104 页)

17.11 给定rand5(),实现一个方法 rand7()。也即,给定一个产生 0 到 4(含)随机数 的方法,编写一个产生 0 到 6(含)随机数的方法。(第 105 页)


17.12 设计一个算法,找出数组中两数之和为指定值的所有整数对。(第 105 页)

整数到整数的散列映射

Two Pointer


17.13 有个简单的类似结点的数据结构BiNode,包含两个指向其他结点的指针。数据结 构 BiNode可用来表示二叉树(其中node1 为左子结点,node2 为右子结点)或双向链表(其中node1 为前趋结点,node2 为后继结点)。编写一个方法,将二叉查找树(用BiNode实现)转换为双向 链表。要求所有数值的排序不变,转换操作不得引入其他数据结构(即直接操作原先的数据结构)。 (第 105 页)


17.13 有个简单的类似结点的数据结构BiNode,包含两个指向其他结点的指针。数据结 构 BiNode可用来表示二叉树(其中node1 为左子结点,node2 为右子结点)或双向链表(其中node1 为前趋结点,node2 为后继结点)。编写一个方法,将二叉查找树(用BiNode实现)转换为双向 链表。要求所有数值的排序不变,转换操作不得引入其他数据结构(即直接操作原先的数据结构)。 (第 105 页)

一种做法是递归访问整个字符串。在每个时间点上,最佳解析是从两种可能决定中择优而取。

(1) 在这个字符后插入一个空格。

(2) 不在这个字符后插入一个空格。

results matching ""

    No results matching ""