100天算法入门 - 每日三题 - Day9汇总区间2的幂有效的字母异位词
Posted 哪 吒
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了100天算法入门 - 每日三题 - Day9汇总区间2的幂有效的字母异位词相关的知识,希望对你有一定的参考价值。
大家好,我是哪吒,一个热爱编码的Java工程师,本着“欲速则不达,欲达则欲速”的学习态度,在程序猿这条不归路上不断成长,所谓成长,不过是用时间慢慢擦亮你的眼睛,少时看重的,年长后却视若鸿毛,少时看轻的,年长后却视若泰山,成长之路,亦是渐渐放下执念,内心归于平静的旅程。
也许,我们永远都不会知道自己能走到何方,遇见何人,最后会变成什么样的人,但一定要记住,能让自己登高的,永远不是别人的肩膀,而是挑灯夜战的自己,人生的道路刚刚启程,当你累了倦了也不要迷茫,回头看一看,你早已不再是那个年少轻狂的少年。
大连棒棰岛
算法是进阶架构师的基础,基础不牢,地动山摇,2021-8-14起开始刷题,目标100天,300道LeetCode算法题,分享是学习的最好方式,加油,嗨起来。
1、LeetCode 228.汇总区间
题目
给定一个无重复元素的有序整数数组 nums 。
返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表。也就是说,nums 的每个元素都恰好被某个区间范围所覆盖,并且不存在属于某个范围但不属于 nums 的数字 x 。
输入:nums = [0,1,2,4,5,7]
输出:["0->2","4->5","7"]
小编菜解
public static List<String> summaryRanges(int[] nums) {
int step = -1;
int next = 0;
int over = 0;
int curren = 0;
List<String> list = new ArrayList<>();
for(int i = 0;i<nums.length;i++){
int c = nums[i];
if (i<=curren + step){
continue;
}
curren = i;
String temp = "";
step = 0;
if(i+1+step == nums.length){
list.add(String.valueOf(c));
break;
}
next = nums[i+1+step];
while (next - c == 1+step){
over = next;
step++;
if(i+1+step < nums.length){
next = nums[i+1+step];
}
}
if (step == 0){
temp = String.valueOf(c);
}else{
temp += c + "->"+over;
}
list.add(temp);
}
return list;
}
够麻烦的啊,菜啊。
大佬指点江山
public static List<String> summaryRanges2(int[] nums) {
List<String> ret = new ArrayList<String>();
int i = 0;
int n = nums.length;
while (i < n) {
int low = i;
i++;
while (i < n && nums[i] == nums[i - 1] + 1) {
i++;
}
int high = i - 1;
StringBuffer temp = new StringBuffer(Integer.toString(nums[low]));
if (low < high) {
temp.append("->");
temp.append(Integer.toString(nums[high]));
}
ret.add(temp.toString());
}
return ret;
}
2、LeetCode 231.2的幂
题目
给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false 。
如果存在一个整数 x 使得 n == 2x ,则认为 n 是 2 的幂次方。
小编菜解
public static boolean isPowerOfTwo(int n) {
if (n == 1){
return true;
}
while (true){
if (n/2 >1 && n%2==0){
n = n/2;
}else{
if (n == 2){
return true;
}else{
return false;
}
}
}
}
思路分析
一个数 nn 是 22 的幂,当且仅当 nn 是正整数,并且 nn 的二进制表示中仅包含 11 个 11。
因此我们可以考虑使用位运算,将 nn 的二进制表示中最低位的那个 11 提取出来,再判断剩余的数值是否为 00 即可。
n & (n - 1)
其中 \\texttt{\\&}& 表示按位与运算。该位运算技巧可以直接将 nn 二进制表示的最低位 11 移除。
大佬指点江山
public boolean isPowerOfTwo(int n) {
return n > 0 && (n & (n - 1)) == 0;
}
二进制还不太会玩,惭愧啊。
3、LeetCode 205.有效的字母异位词
题目
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
小编解题思路
取出所有字母的个数放入map,两个字符串如果是字母异位词,则map一定相等。
小编菜解
public static boolean isAnagram(String s, String t) {
Map<Character,Integer> map = new HashMap<>();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if(map.containsKey(c)){
map.put(c,map.get(c)+1);
}else{
map.put(c,1);
}
}
Map<Character,Integer> map2 = new HashMap<>();
for (int i = 0; i < t.length(); i++) {
char c = t.charAt(i);
if(map2.containsKey(c)){
map2.put(c,map2.get(c)+1);
}else{
map2.put(c,1);
}
}
return map.equals(map2);
}
思路分析
t 是 ss 的异位词等价于「两个字符串排序后相等」。因此我们可以对字符串 ss 和 tt 分别排序,看排序后的字符串是否相等即可判断。此外,如果 ss 和 tt 的长度不同,tt 必然不是 ss 的异位词。
大佬指点江山
public static boolean isAnagram(String s, String t) {
char[] c1 = s.toCharArray();
char[] c2 = t.toCharArray();
Arrays.sort(c1);
Arrays.sort(c2);
return Arrays.equals(c1,c2);
}
推荐阅读
【100天算法入门 - 每日三题 - Day1】二叉树的中序遍历、两数之和、整数反转
【100天算法入门 - 每日三题 - Day2】二分查找、第一个错误的版本、搜索插入位置
【100天算法入门 - 每日三题 - Day3】回文数、罗马数字转数字、最大公共前缀
【100天算法入门 - 每日三题 - Day4】有效的括号、删除有序数组中的重复项、实现strStr
【100天算法入门 - 每日三题 - Day5】最后一个单词的长度、相同的树、买卖股票的最佳时机
【100天算法入门 - 每日三题 - Day6】对称二叉树、二叉树的最大深度、将有序数组转换为二叉搜索树
以上是关于100天算法入门 - 每日三题 - Day9汇总区间2的幂有效的字母异位词的主要内容,如果未能解决你的问题,请参考以下文章
100天算法入门 - 每日三题 - Day12Nim游戏3的幂4的幂
100天算法入门 - 每日三题 - Day15判断子序列最长回文数Fizz Buzz
100天算法入门 - 每日三题 - Day16第三大的数字符串中的单词数排列硬币
100天算法入门 - 每日三题 - Day5最后一个单词的长度相同的树买卖股票的最佳时机