将m,n(m>n)的连续自然数序列,打乱顺序重新排列,随机取出一个数,试问取出的这个数是多少?使用一种解法,时间复杂度O(m-n),空间复杂度O(1)
2014-05-15 00:43
941 查看
注意首先这里的数的个数可能很大,所以不能够把这些数都加起来,这样做会越界而且效率不高,我这里使用的方法是位运算。通过抑或特有的性质.A^B=C 则同时有 B^C=A 无参数的交换 也同样是借助了这个性质。Java代码如下
package algorithm.bitwise;
public class SelectAbsentNum {
private int m = 15;
private int n = 5;
private int[] testList = { 7, 5, 8, 13, 6, 12, 10, 15, 14, 11 };
private int originalResult() {
if (n < m) {
int res = 0;
for (int i = n; i <= m; i++) {
res ^= i;
}
return res;
}
return 0;
}
private int testResult() {
if(testList != null){
int res = 0;
for (int i : testList) {
res ^= i;
}
return res;
}
return 0;
}
public int getAbsentNum() {
return originalResult() ^ testResult();
}
public static void main(String[] args) {
System.out.println(new SelectAbsentNum().getAbsentNum());;
}
}
package algorithm.bitwise;
public class SelectAbsentNum {
private int m = 15;
private int n = 5;
private int[] testList = { 7, 5, 8, 13, 6, 12, 10, 15, 14, 11 };
private int originalResult() {
if (n < m) {
int res = 0;
for (int i = n; i <= m; i++) {
res ^= i;
}
return res;
}
return 0;
}
private int testResult() {
if(testList != null){
int res = 0;
for (int i : testList) {
res ^= i;
}
return res;
}
return 0;
}
public int getAbsentNum() {
return originalResult() ^ testResult();
}
public static void main(String[] args) {
System.out.println(new SelectAbsentNum().getAbsentNum());;
}
}
相关文章推荐
- 使用Jquery随机删除一个顺序列表中某个子元素的方法,保持效果统一性
- 如何判断一个整数数组中是否有重复元素?要求时间复杂度O(n),空间复杂度O(1)
- Java基础之随机打乱一个顺序数组
- (用树结构支持并查集8.2.2)POJ 1988 Cube Stacking(并查集的使用:判断一个集合中元素的个数---->>某一个元素的下面还有多少个元素)
- 一组连续的数据,打乱次序后,随机取出某一个数字,用最简单的方法查找出取出的数字(求解)
- 每天学习一算法系列(25)(一个台阶总共有n 级,如果一次可以跳1 级,也可以跳2 级,求总共有多少总跳法,并分析算法的时间复杂度。)
- 输入一个数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。 时间复杂度O(N) 空间复杂度O(N)
- 随笔:设计一个栈结构,使得取出栈中最大值时间复杂度为O(1)
- 请问这个解法的时间复杂度怎么分析?谢谢!
- 写一个函数int get(),这个函数运行一次可以从V[N]里随机取出一个数,而这个数必须是符合1/N平均分布的
- [转]给你一个单词a,如果通过交换单词中字母的顺序可以得到另外的单词b,那么定义b是a的兄弟单词。现在给你一个字典,用户输入一个单词,让你根据字典找出这个单词有多少个兄弟单词
- 给你一个单词a,如果通过交换单词中字母的顺序可以得到另外的单词b,那么定义b是a的兄弟单词。现在给你一个字典,用户输入一个单词,让你根据字典找出这个单词有多少个兄弟单词。
- PHP 查找一个在数组中出现次数超过一半的数,时间复杂度O(n),空间复杂度O(1)
- 任意一个5位数,比如:34256,把它的各位数字打乱,重新排列,可以得到一个最大的数:65432, 一个最小的数23456。求这两个数字的差,得:41976,把这个数字再次重复上述过程(如果不足5位,
- 编号为 1 到 n 的 n 个元素,顺序的进入一个栈,则可能的出栈序列有多少种?[摘]
- 如何判断一个整数数组中是否有重复元素?要求时间复杂度O(n),空间复杂度O(1)
- 用Collection.shuffle()随机打乱一个顺序数组
- 设rand(s,t)返回[s,t]之间的随机小数,利用该函数在一个半径为R的圆内找随机n个点,并给出时间复杂度分析。
- 一组连续的数据,打乱次序后,随机取出某一个数字,用最简单的方法查找出取出的数字(求解)
- 输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分,所 有偶数位于数组的后半部分。要求时间复杂度为O(n)。