/**
* 给定一个字符串,包含大小写字母、标点符号、空格;另外给定一个偏移量,字母将变为偏移量之后的字母。
* 如偏移量为2,则a变为c,则z变为b;如果偏移后的字母是元音字母aeiouAEIOU,则将该字符转换为对应的大小写(小写变大写,大写变小写)
*/
public static String transCharacter(int offset, String orginalStr) {
// 字符偏移量:比如字母c char c = 'a' + (c-'a'+offset)%26
char[] charArray = orginalStr.toCharArray();
StringBuilder sb = new StringBuilder();
for (char c : charArray) {
if (Character.isLetter(c)) {
if (Character.isUpperCase(c)) {
c = (char) ('A' + (c - 'A' + offset) % 26);
if ("AEIOU".indexOf(c) != -1) {
sb.append(Character.toLowerCase(c));
} else {
sb.append(c);
}
} else {
c = (char) ('a' + (c - 'a' + offset) % 26);
if ("aeiou".indexOf(c) != -1) {
sb.append(Character.toUpperCase(c));
} else {
sb.append(c);
}
}
} else {
sb.append(c);
}
}
return sb.toString();
/**
* 贴瓷砖
* 给定一个二维数组,二维数组中数字代表瓷砖,瓷砖有左右区间,为左闭右开。
* 另外给定一个长度length,代表[0,length]
* 判断二维数组内的砖块能否铺成[0,length],如果能则返回这些砖块的索引,否则返回空数组
* 判断能否铺成[0,length]的条件是砖块之间不能有重叠和空的部分。
* 举例:
* length=10;nums={{5,8},{0,5},{8,10}}
* 输出:
* {1,0,2}
* 解释:
* 先选择第1个砖块即{0,5},再选择第0个砖块即{5,8},最后选择第2个砖块即{8,10},能够铺成[0,10]区间
*/
public static int[] pavedRoad(int length, int[][] nums) {
// 直接对二维数组按照左端点升序排序,然后判断前一个数的右端点是否等于后一个数的左端点
int len = nums.length;
List<Integer> index = new ArrayList<>();
for (int i = 0; i < len; i++) {
index.add(i);
}
// 左端点升序排序,记录对应索引下标
index.sort(Comparator.comparing(x -> nums[x][0]));
int[] res = new int[len];
if (nums[0][0] != 0 || nums[len - 1][1] != length) {
return new int[0];
}
for (int i = 0; i < len - 1; i++) {
int former = index.get(i);
int latter = index.get(i + 1);
// 前一个数的右端点是否等于后一个数的左端点,将索引下标取出放入res中
if (nums[former][1] == nums[latter][0]) {
res[i] = index.get(i);
} else {
return new int[0];
}
}
// 补上末尾元素(因为已经升序排序了,这里直接添加最后一个数据塞入即可)
res[len - 1] = index.get(len - 1);
return res;
}