2000. 反转单词前缀 / 1636. 按照频率将数组升序排序

2000. 反转单词前缀【简单题】【每日一题】

思路:【StringBuilder模拟】

  1. 通过String的indexof函数找出指定字符ch在word中首次出现的下标(如果word中没有出现ch则返回-1)。
  2. 将word转换为可变字符串sb。
  3. 如果word中没有出现ch,即index<0,直接返回word。
  4. 否则,将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】

  1. 首先,通过一个长度为201的int类型数组cnt来统计nums中每个数的出现频率,数值与下标的关系为:下标等于数值+100。
  2. 然后,通过一个泛型为<Integer,List 《Integer》 > 的哈希表 map来统计出现次数和对应的数字,因为可能存在出现次数相同的不同数字,这个时候将它们全部添加到key为出现次数所对应的value列表中。
  3. 定义最后的结果列表list,从1到100遍历所有可能的出现次数,如果map中存在这样的出现次数,那么:
  4. 倒序遍历当前出现次数对应的value列表(因为题目要求当出现次数相同时,需要按照数值本身逆序排序,而value列表中我是按数值从小到大的顺序添加的),将遍历到的value列表中的数值添加到list中i遍。(这里需要需要注意,当list的长度与nums长度相同时,就没有再往下遍历了,实测加了这一段判断代码之后会快1ms)
  5. 最后将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;
    }
}

运行时间比较:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值