问题描述
- 求助Java算法,这两个算法问题有Java代码实现
-
- 从N个元素集合里面随机抽取M个元素(M<N)。
C/C++:
void randomChoose(int*data, intn, int *result, int m);
Java:
void randomChoose(int data[], int result[]);说明:
1.Data是待抽取的元素集合,n是data的长度,result是抽取的结果,m是结果集的长度。
2.同一个元素不能被反复抽取。
3.每个元素被抽取到的概率必须相同。
4.不需要自己写随机函数,C版本中允许使用rand()函数,java版本中允许使用Random对象
5.算法效率尽可能高
6.必须要有代码注释和算法说明。
例如:data里面的数据是{3, 4, 9}。n = 3, m = 2。此时result的可能输出结果有{3, 4},{3, 9},{4, 9},{4,3},{9, 3},{9, 4},每种可能的输出概率相同。
2.交换链表的奇偶顺序函数说明:
swap函数交换链表第2i和第2i+1个元素(如果都有的话),并返回交换之后的链表。
示例:
交换前链表的顺序 交换后链表的顺序
1→2→3→4→5 ==> 2→1→4→3→5
1 ==> 1 (链表仅含一个元素)
1→2 ==> 2→1
==> (链表为空)C/C++:
链表节点定义为:
struct node {
struct node *next;
…
};
struct node *swap(struct node *list);
Java:
链表节点定义为:
class Node {
public Node next;
…
}
Node swap(Node list)注意点和要求如下:
0. swap函数返回新的链表指针
1. swap函数要求对节点的指针/引用进行操作(不得创建任何新的链表节点)
2. 不得使用任何库函数/API,如需使用类似功能, 请自行实现
3. 不得将链表转化为其他类型数据结构再进行交换,如数组等
解决方案
http://bylijinnan.iteye.com/blog/1468985
解决方案二:
下面一个问题用递归。