2000. 反转单词前缀【简单题】【每日一题】
思路:【StringBuilder模拟】
- 通过String的indexof函数找出指定字符ch在word中首次出现的下标(如果word中没有出现ch则返回-1)。
- 将word转换为可变字符串sb。
- 如果word中没有出现ch,即index<0,直接返回word。
- 否则,将word从0位置到index位置(包括index)截取出来转换为可变字符串sb_pre,将sb的前index个字符删除(即从0到index+1),然后将在sb的头部插入翻转后的sb_pre,将修改后的sb转为String类型赋值给word,最后返回word。
代码:
class Solution {
public String reversePrefix(String word, char ch) {
StringBuilder sb = new StringBuilder(word);
int index = word.indexOf(ch);
if (index>=0){
StringBuilder sb_pre = new StringBuilder(word.substring(0,index+1));
word = sb.delete(0,index+1).insert(0,sb_pre.reverse()).toString();
}
return word;
}
}
1636. 按照频率将数组升序排序【简单题】
思路:【HashMap+List】
- 首先,通过一个长度为201的int类型数组cnt来统计nums中每个数的出现频率,数值与下标的关系为:下标等于数值+100。
- 然后,通过一个泛型为<Integer,List 《Integer》 > 的哈希表 map来统计出现次数和对应的数字,因为可能存在出现次数相同的不同数字,这个时候将它们全部添加到key为出现次数所对应的value列表中。
- 定义最后的结果列表list,从1到100遍历所有可能的出现次数,如果map中存在这样的出现次数,那么:
- 倒序遍历当前出现次数对应的value列表(因为题目要求当出现次数相同时,需要按照数值本身逆序排序,而value列表中我是按数值从小到大的顺序添加的),将遍历到的value列表中的数值添加到list中i遍。(这里需要需要注意,当list的长度与nums长度相同时,就没有再往下遍历了,实测加了这一段判断代码之后会快1ms)
- 最后将list中的各个元素更新到nums中同一下标处,返回nums即可。
代码:
class Solution {
public int[] frequencySort(int[] nums) {
int[] cnt = new int[201];
for (int n : nums){
cnt[n+100]++;
}
Map<Integer,List<Integer>> map = new HashMap<>();
for (int i = 0; i < 201; i++) {
if (cnt[i] != 0){
int k = cnt[i];
List<Integer> temp;
if (!map.containsKey(k)){
temp = new ArrayList<>();
}else {
temp = map.get(k);
}
temp.add(i-100);
map.put(k,temp);
}
}
List<Integer> list = new ArrayList<>();
int l = nums.length;;
for (int i = 1; i <= 100; i++) {
if (map.containsKey(i)){
List<Integer> temp = map.get(i);
int len = temp.size();
for (int j = len-1; j >= 0 ; j--) {
for (int k = 0; k < i; k++) {
list.add(temp.get(j));
}
}
}
if (list.size() == l){
break;
}
}
for (int i = 0; i < l; i++) {
nums[i] = list.get(i);
}
return nums;
}
}
运行时间比较: