16、字符串处理,有m+1个办公室,编号0,1,2,…,m,每个员工来上班时会在将自己所在的办公室记录在保安登记表 int[] office中,现在求空置的办公室编号中、最长的连续空置的办公室。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.stream.Stream;
public class Test1 {
public static void main(String[] args) {
int[] office;
int num;
Solution solution = new Solution();
String ret;
office = new int[] {5,1,1,2};
num = 9;
ret = solution.getUnusedOffice(office,num);
System.out.println("ret = " + ret);
office = new int[] {2,5,1,1,2,3,4,0,0};
num = 5;
ret = solution.getUnusedOffice(office,num);
System.out.println("ret = " + ret);
office = new int[] {1,3,5,6,8};
num = 8;
ret = solution.getUnusedOffice(office,num);
System.out.println("ret = " + ret);
office = new int[] {0,3,4};
num = 6;
ret = solution.getUnusedOffice(office,num);
System.out.println("ret = " + ret);
}
static class Solution<e> {
public String getUnusedOffice(int[] office, int num) {
// 初始化
boolean[] useFlag = new boolean[num + 1];
Stream.iterate(0, i -> i + 1).limit(num + 1).forEach(i -> useFlag[i] = false);
Arrays.stream(office).forEach(i -> useFlag[i] = true);
//定义unUsedList链表保存未使用的办公室始末位置
int begin = 0;
ArrayList<int[]> unUsedList = new ArrayList<>();
for (int i = 0; i <= num; i++) {
if (useFlag[i]) {
if (i > begin) {
unUsedList.add(new int[]{begin, i - 1});
}
begin = i + 1;
}
}
if (begin != num + 1) {
unUsedList.add(new int[]{begin, num});
}
// 未使用办公室末位置-起始位置,为空值办公室的长度,按长度降序排列
Collections.sort(unUsedList, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
if (o1[1] - o1[0] > o2[1] - o2[0]) {
return -1;
} else {
return 1;
}
}
});
StringBuilder resultBuilder = new StringBuilder();
for(int[] a : unUsedList) {
int max = unUsedList.get(0)[1] - unUsedList.get(0)[0];
if(a[1] - a[0] == max) {
resultBuilder.append(resultBuilder.length() == 0 ? "" : ",");
resultBuilder.append(a[1] == a[0] ? a[0] : a[0] + "-" + a[1]);
} else {
break;
}
}
return resultBuilder.toString();
}
}
}
方法二:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.stream.Stream;
public class Test1 {
public static void main(String[] args) {
int[] office;
int num;
Solution solution = new Solution();
String ret;
office = new int[] {5,1,1,2};
num = 9;
ret = solution.getUnusedOffice(office,num);
System.out.println("ret = " + ret);
office = new int[] {2,5,1,1,2,3,4,0,0};
num = 5;
ret = solution.getUnusedOffice(office,num);
System.out.println("ret = " + ret);
office = new int[] {1,3,5,6,8};
num = 8;
ret = solution.getUnusedOffice(office,num);
System.out.println("ret = " + ret);
office = new int[] {0,3,4};
num = 6;
ret = solution.getUnusedOffice(office,num);
System.out.println("ret = " + ret);
}
static class Solution<e> {
public String getUnusedOffice(int[] office, int num) {
// 初始化
boolean[] useFlag = new boolean[num + 1];
Stream.iterate(0, i -> i + 1).limit(num + 1).forEach(i -> useFlag[i] = false);
Arrays.stream(office).forEach(i -> useFlag[i] = true);
//定义unUsedList链表保存未使用的办公室始末位置
int begin = 0;
ArrayList<int[]> unUsedList = new ArrayList<>();
for (int i = 0; i <= num; i++) {
if (useFlag[i]) {
if (i > begin) {
unUsedList.add(new int[]{begin, i - 1});
}
begin = i + 1;
}
}
if (begin != num + 1) {
unUsedList.add(new int[]{begin, num});
}
// 未使用办公室末位置-起始位置,为空值办公室的长度,按长度降序排列
Collections.sort(unUsedList, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
if (o1[1] - o1[0] > o2[1] - o2[0]) {
return -1;
} else {
return 1;
}
}
});
if (!unUsedList.isEmpty()) {
int max = unUsedList.get(0)[1] - unUsedList.get(0)[0] + 1;
unUsedList.forEach (i -> {
if (i[1] - i[0] + 1 == max) {
resultBuilder.append(resultBuilder.length() == 0 ? "" : ",");
resultBuilder.append(i[1] == i[0] ? i[0] : i[0] + "-" + i[1]);
}
});
}
return resultBuilder.toString();
}
}
}