这四道题之前都做过!比第一次顺利一些,不过还是得看题解,磕磕绊绊的。不过我相信坚持下去一定会越来越好滴!

242.有效的字母异位词

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。

输入: s = "anagram", t = "nagaram"
输出: true

方法一:map记录次数

将串1的字符存放在map中。key值为0-26个字母的ASCII值,value为出现次数。

再通过串2减去map对应的value。最后遍历map,如果所有value都为0则返回true。

    public static boolean isAnagram(String s, String t) {Map<Integer,Integer> map=new HashMap<Integer,Integer>();int len1=s.length();int len2=t.length();if(len1!=len2){return false;}for(int i=0;i<len1;i++){map.put(s.charAt(i)-'a',map.getOrDefault(s.charAt(i)-'a',0)+1);}for(int i=0;i<len2;i++){map.put(t.charAt(i)-'a',map.getOrDefault(t.charAt(i)-'a',0)-1);}for(int i=0;i<26;i++){if(map.containsKey(i)){if(map.get(i)!=0){return false;}}}return true;}

方法二:数组记录

因为字符只有26个,因此数组下标可对应26个字母,对应元素代表出现次数(比map快)

       if (s.length() != t.length()) {return false;}int[] a = new int[26];for (int i = 0; i < s.length(); i++) {a[s.charAt(i) - 'a']++;}for (int i = 0; i < s.length(); i++) {a[t.charAt(i) - 'a']--;}for (int i : a) {if (i != 0) {return false;}}return true;

349. 两个数组的交集

给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。

输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]

方法一:双哈希set

set1存放第一个数组包含的数字,set2进行判断,若第二个数组元素存在于set1中,则代表该元素为重复元素,存放在set2中。最后set2存放元素即为重复出现的元素。

由于set为单列集合且不可重复,因此不会出现包含重复元素的情况

   public static int[] intersection(int[] nums1, int[] nums2) {Set<Integer> set1=new HashSet<>();Set<Integer> set2=new HashSet<>();for(int i:nums1){set1.add(i);}for(int i:nums2){if(set1.contains(i)){set2.add(i);}}int count=0;int[] res=new int[set2.size()];for(int i:set2){res[count++]=i;}return res;}

方法二:排序+双指针

首先对两个数组进行排序。index1,index2代表指向两个数组的下标。对两个指针从左向右移动。

谁小谁的指针向右移动。若相等则代表此元素为重复元素。

遇到的问题:如何去除重复元素?——语句!

if(count==0||res[count-1]!=nums1[index1]) 如果是第一次添加(防止count-1=-1出现异常),或者该元素与上一个添加的元素不相等,则代表该元素没有重复出现,再对该元素进行添加即可。

每次遇到重复元素,两个指针都向右移动一位。直到有一个指针到达末尾。

        Arrays.sort(nums1);Arrays.sort(nums2);if (nums1.length < nums2.length) {intersection(nums2, nums1);}int[] res = new int[nums1.length];int index1 = 0;int index2 = 0;int count = 0;while (index1<nums1.length&&index2<nums2.length) {if (nums1[index1] < nums2[index2]) {index1++;} else if (nums1[index1] > nums2[index2]) {index2++;} else {//重要!!判断新数组是否重复条件! 可以用或表达式!!!if(count==0||res[count-1]!=nums1[index1]){res[count++] = nums1[index1];}index1++;index2++;}}return Arrays.copyOfRange(res, 0, count);

小技巧:如何只返回数组前n个元素?—— Arrays.copyOfRange(res, 0, count)

202.快乐数

编写一个算法来判断一个数 n 是不是快乐数。

「快乐数」 定义为:

对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
如果这个过程 结果为 1,那么这个数就是快乐数。
如果 n 是 快乐数 就返回 true ;不是,则返回 false 。

示例 :

输入:n = 19
输出:true
解释:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1

首先理解定义:所有数每位之和最后要么无限循环,要么变成1

首先第一步,写出求和函数:

每次加个位(n%10)的平方,再去掉个位直至为0.

    public static int add(int n) {int sum = 0;while (n != 0) {sum += (n % 10 )* (n % 10);n = n / 10;}return sum;}

方法一:set集合

判断该数是否已经出现在set集合中,若未出现则添加,若出现过且不为1,则代表无限循环,返回false。

小技巧:如何判断并添加元素到set集合中?——add方法。若已存在则添加失败返回false。若不存在则添加成功返回true。

    public static boolean isHappy(int n) {Set<Integer> set = new HashSet<>();while (n != 1) {if (!set.add(n)) //代表set集合中存在了该元素{return false;}n = add(n);}return true;}

方法二:快慢指针

因为最后都会出现循环,要么无限循环,要么1循环。因此定义快慢指针。快指针每次跳2个,慢指针每次跳一个。最后判断相遇(即出现循环)的数是否为1即可。

   public static boolean isHappy(int n) {int slow=add(n);int fast=add(n);fast=add(fast);while(slow!=fast && fast!=1){slow=add(slow);fast=add(fast);fast=add(fast);}return fast==1;}public static int add(int n) {int sum = 0;while (n != 0) {sum += (n % 10 )* (n % 10);n = n / 10;}return sum;}

1. 两数之和

方法一:map集合

map集合存放出现的数,key代表元素,value代表下标。每次添加前判断target-key是否存在在map中。若存在,则返回下标即可。

        Map<Integer,Integer> map=new HashMap<>();int[] a=new int[2];for(int i=0;i<nums.length;i++){int x=nums[i];if(map.containsKey(target-x)){a[0]=i;a[1]=map.get(target-x);}map.put(x,i);}return a;

方法二:双指针

此方法相当于遍历两个集合中所有元素。从p1=0开始遍历,p2始终等于p1+1.

当p2遍历到数组末尾,p1+1,p2=p1+1继续遍历。

最后返回p1,p2作为新数组的下标即可。

      int p1=0;int p2=1;while (nums[p1]+nums[p2]!=target){p2++;if(p2==nums.length){p1++;p2=p1+1;}}return new int[]{p1,p2};

Day 06 | 242.有效的字母异位词 349. 两个数组的交集 202.快乐数 1. 两数之和相关推荐

  1. day6代码随想录算法训练营| ● 242.有效的字母异位词 ● 349. 两个数组的交集 ● 202. 快乐数● 1. 两数之和

    ● 242.有效的字母异位词 用map的话效率应该会很低吧,特别是查询全部value class Solution { public:bool isAnagram(string s, string t ...

  2. 242. 有效的字母异位词 349. 两个数组的交集

    给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词. 注意: 若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词. 示例 1: 输入: s = & ...

  3. LeetCode Algorithm 242. 有效的字母异位词

    242. 有效的字母异位词 Ideas 对于Python来说,直接创建两个计数器,然后判断计数器是否相等就OK了. 对于C++来说,对两个字符串进行排序,然后逐位对比. Code C++ 原来std的 ...

  4. 242. 有效的字母异位词 golang

    242. 有效的字母异位词 两个单词如果包含相同的字母,次序不同,则称为字母易位词(anagram) 思路 字符转换成byte byte排序 byte挨个对比 // 两个单词如果包含相同的字母,次序不 ...

  5. 高频算法面试题(字符串) 242. 有效的字母异位词

    leetcode 242. 有效的字母异位词 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的一个字母异位词. 示例 1: 输入: s = "anagram", ...

  6. LeetCode 242. 有效的字母异位词 (计数排序思想字符处理)

    242. 有效的字母异位词 题意: 任意给定两个单词字符串,判断这两个字符串是否是字母异位词 思路: 先判断字符串长度是否相等 将s字符串每个字母映射到数组中,在对应位置++ 将t字符串每个字母映射到 ...

  7. 242. 有效的字母异位词-Java

    242. 有效的字母异位词 题目概述 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词.注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词 ...

  8. Java实现 LeetCode 242 有效的字母异位词

    242. 有效的字母异位词 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词. 示例 1: 输入: s = "anagram", t = " ...

  9. LeetCode 242. 有效的字母异位词【哈希表】

    242. 有效的字母异位词 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词. 注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词. 示例 ...

最新文章

  1. Win7部署基础知识(7):使用Imagex捕获和安装映像
  2. GBDT分类和回归例子
  3. 360天气怎么设置方法 360天气如何设置城市
  4. 中兴高调秀Axon 10 Pro 5G版20倍变焦样张:号称媲美万元广角镜头
  5. Yearn已完成对于6666枚YFI的增发
  6. 一个完整的pytorch预训练实现图像分类,模型融合
  7. 语言混编之java调用c_Java通过JNI调用C语言库
  8. oracle bip报表乱码,Oracle EBS的BIP报表中显示特殊字体
  9. win10 C语言qt调试,如何在Windows中调试Qt(MSVC)应用程序
  10. TAOCP_READING 1.1完
  11. 小游戏开发设计之塔防类游戏
  12. Halcon轮廓提取
  13. 51单片机波形发生器51c语言,51单片机实现波形发生器.doc
  14. 关于导入.a文件后报错Undefined symbols for architecture arm64:
  15. 全国计算机等级二级C语言上机编程题题型
  16. 无法在设置线程模式后对其加以更改
  17. jzoj3424. 【NOIP2013模拟】粉刷匠
  18. 不属于c语言程序运算符,以下选项中不属于C语言程序运算符的是( )
  19. 关于 /dev/urandom 的流言终结
  20. Oracle数据库配置二

热门文章

  1. php 表示什么,php是什么意思
  2. 数据挖掘十大经典算法(转存)
  3. Python学习实践 | speech智能语音模块
  4. Code Complete《代码大全》读书笔记
  5. 2019年上半年软件设计师下午试题
  6. 多线程教程(九)偏向锁
  7. 20届icoding 实验1
  8. 51单片机精确延时设计
  9. 基于RWEQ模型的土壤风蚀模数估算及其变化归因分析
  10. 【檀越剑指大厂--mysql】mysql基础篇