[每日两题系列]刷算法题咯~~

        本系列所选题目均来自力扣或者牛客网站. 所选题目主要是以其中的简单题为主, 中等题为辅, 包含少数困难题(原因是: 本人目前能力还不够~ ). 开展这个系列的目的是督促自己, 在暑假的时间里也要保持有一定的刷题量, 拒绝摆烂~
        话不多说, 直接开刷~~

判定是否互为字符重排

        题目描述: 给定两个字符串 s1 和 s2,请编写一个程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。

解题思路:
        (1) 由于这道题规定了字符串中的字符都只能是小写的英文字母, 所以, 我们这里使用哈希表来记录每个字符出现的次数效率会比较高.
        (2) 如果两个字符串的长度不相等, 那么直接就可以判定不是重新排列后的结果; 在一个循环里面同时遍历两个字符串, 在第一个字符串中遍历到一个字符, 就在数组对应的位置上的值加加一下, 在第二个字符串中遍历到一个字符, 就在数组对应的位置上的值减减一下.
        (3) 最后看看这个数组中所有位置上的值是否都是0, 如若是, 则确定这两个字符串是重新排列后的结果; 如若不是, 则这两个字符串不是重新排列后的结果.

实现代码:

class Solution {
    public boolean CheckPermutation(String s1, String s2) {
        if(s1.length()!=s2.length()){
            return false;
        }
        int[] array=new int[26];
        int slen=s1.length();
        for(int i=0;i<slen;i++){
            char ch1=s1.charAt(i);
            array[ch1-97]++;
            char ch2=s2.charAt(i);
            array[ch2-97]--;
        }
        for(int i=0;i<26;i++){
            if(array[i]!=0){
                return false;
            }
        }
        return true;
    }
}

最后一块石头的重量

        题目描述: 有一堆石头,每块石头的重量都是正整数。
        每一回合,从中选出两块 最重的 石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下:
        如果 x == y,那么两块石头都会被完全粉碎;
        如果 x != y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x。
        最后,最多只会剩下一块石头。返回此石头的重量。如果没有石头剩下,就返回 0。

解题思路:
        (1) 本题我们可以使用优先级队列(堆)的思想.
        (2) 由于我们每次要找的是数组中第一大值和第二大值来相减, 所以, 这里就需要建立小根堆了.
        (3) 首先将数组中的值全部添加要这个小根堆里面去.
        (4) 循环判断堆中的元素个数(>=2), 连续拿两次堆顶元素, 既是最大值和次大值, 将两者相减, 如果不为0, 则将其添加要堆中… 直到堆中只剩下一个元素, 这个元素就是最后石头们剩下的重量了.

实现代码:

class Solution {
    public int lastStoneWeight(int[] stones) {
        PriorityQueue<Integer> priorityQueue=new PriorityQueue<>(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2-o1;
            }
        });
        for(int i=0;i<stones.length;i++){
            priorityQueue.offer(stones[i]);
        }
        while(priorityQueue.size()>1){
            int stones1=priorityQueue.poll();
            int stones2=priorityQueue.poll();
            int tmp=stones1-stones2;
            if(tmp!=0){
                priorityQueue.offer(tmp);
            }
        }
        if(priorityQueue.size()==1){
            return priorityQueue.peek();
        }
        return 0;
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蔡欣致

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值