程序员便利贴
分类: Java | 评论

问题: 给你两个整数,比如 a = 10, b = 20,在不占用任何额外空间的条件下交换两个数的值。 思路: 首先,问题看起来是挺不可思议,但是也是挺有趣的。既然不能占用任何空间,只能在已有的变量上打主意。这里有两个方法,看完代码自己就能马上明白,所以就不多解释了。 方法1: int a = 10; int b = 20; a = a^b; b = b^a; a = a^b; 这个方法用到了一个事实:任何数自己和自己异或(XOR)后等于0. 方法2: int a = 10; int b = 20; a = a + b; b = a – b; a = a – b; 这两种方法最好选用第一种,因为第二种会有溢出的情况发生。

分类: Java | 1 条评论

问题: 给你两个整数 a 和 b,仅仅使用加法,实现 a – b, a * b, a / b。 分析: 对于减法,因为 a – b = a + (-1) * b, 换句话说,我们只要得到 b 的相反数,就可以用加法实现 a – b。 对于乘法,a * b 相当于是 对 |a| 做 |b| 次连加, 或者对 |b| 做 |a| 次连加,但是,这里我们必须要注意,a 和 b 都有可能是负数。 对于除法,a / b 相当于是让|b| 自己加自己,然后我们设置一个计数器,当|b| 加自己大于 |a| [...]

分类: Java | 评论

问题: 把字符串压缩,比如aaabbbbc, 压缩后成为:a3b4c1。 分析: 这题很简单,我们只需要从头到尾遍历一遍字符串即可。首先设置一个计数器count, 每次“指针移位”的时候,判断当前字符是否与前一个字符相等,如果相等,count++, 指针继续下移,否则,我们需要对前面已经遍历的字符串进行处理,然后重新初始化count,直到字符串遍历结束。这题的关键是对最后一个字符的处理。 public static String compress(char[] array) { if (array == null || array.length == 0 ) return null; int count = 1; StringBuilder sb = new StringBuilder(); //save the compressed string for (int index = 1; index < array.length; index++) { if (array[index] == array[index - 1]) { count++; [...]