今日题目
本系列所选题目均来自力扣或者牛客网站. 所选题目主要是以其中的简单题为主, 中等题为辅, 包含少数困难题(原因是: 本人目前能力还不够~ ). 开展这个系列的目的是督促自己, 在暑假的时间里也要保持有一定的刷题量, 拒绝摆烂~
话不多说, 直接开刷~~
判定是否互为字符重排
题目描述: 给定两个字符串 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;
}
}