我正在参加「掘金·启航计划」
问题1:
在数组r[n]中删除重复的元素,要求移动元素的次数较少并使剩余元素的相对次序保持不变。
根据问题设计算法,该问题可以使用蛮力法
首先介绍一下蛮力法:
蛮力法是指采用遍历(扫描)技术,即采用一定的策略将待求解问题的所有元素依次处理一次,从而找出问题的解。依次处理所有元素是蛮力法的关键,为了避免陷入重复试探,应保证处理过的元素不再被处理。
也就是说需要遍历数组,同时遍历次数尽量少点
使用Java语言进行实现
import java.util.ArrayList;
import java.util.List;
public class manlifa3 {
public static void main(String[] args) {
int[] r = {5, 6, 6, 6, 8, 7, 4};
List<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < r.length; i++) {
if (!list.contains(r[i])) {
list.add(r[i]);
}
}
System.out.println("去除重复后的list集合" + list);
}
}
这样就能实现对数组r[]的去重操作。
问题2: 荷兰国旗问题
要求重新排列一个由字符R,W,B(R代表红色,W代表白色,B代表蓝色,这都是荷兰国旗的颜色)构成的数组,使得所有的R都排在最前面,W排在其次,B排在最后。
为荷兰国旗问题设计一个算法,其时间性能是O(n)。
这里用012代替RWB
public class HeLanGuoQi {
public void getHollandSort ( int[] A){
int begin = 0;
int current = 0;
int end = A.length - 1;
while (current <= end) {
if (A[current] == 0) {
swap(A, begin, current);
begin++;
current++;
} else if (A[current] == 1)
current++;
else if (A[current] == 2) {
swap(A, current, end);
end--;
}
}
//输出排完序后的数组A相应元素
System.out.println("对数组A进行划分后的元素顺序为:");
for (int i = 0; i < A.length; i++)
System.out.print(A[i] + " ");
}
//交换数组A中m位置和n位置上元素的值
public void swap ( int[] A, int m, int n){
int temp = A[m];
A[m] = A[n];
A[n] = temp;
}
public static void main (String[]args){
HeLanGuoQi test = new HeLanGuoQi();
int[] A = {2, 0, 2, 0, 0, 2, 1, 1, 0, 2, 1, 0, 1, 2, 0, 1, 2, 0, 1, 0, 2, 1, 0, 2, 0, 1, 2, 0, 1, 2, 0, 2, 1, 0};
test.getHollandSort(A);
}
}
这样就解决了荷兰国旗问题