//给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。 //注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。 只需计算s与t中每个单词出现的次数 创建26大小的数组,存放字母,然后分别在s和t中计算,s中出现的字母就在对应位置记录+1,t中出现的字母就在对应位置记录-1,最后计算是否每个位置都为0。 public boolean isAnagram(String s, String t) { int[] Count=new int[26]; for(int i=0;i<s.length();i++){ Count[s.charAt(i)-'a']++; } for(int i=0;i<t.length();i++){ Count[t.charAt(i)-'a']--; } for(int i=0;i<Count.length;i++){ if(Count[i]!=0) return false; } return true; }
//给定两个数组 nums1 和 nums2 ,返回 它们的 //交集 // 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 先将num1加入set集合(既可以去重,也可以方便后面比较),然后遍历num2的数,如果set中有即为交集就加到re集合中最后返回 public int[] intersection(int[] nums1, int[] nums2) { HashSet<Integer> set=new HashSet<>(); HashSet<Integer> re=new HashSet<>(); for(int i:nums1){ set.add(i); } for (int k : nums2) { if (set.contains(k)) { re.add(k); } } int[] result=new int[re.size()]; int i=0; for(int j:re) result[i++]=j; return result; }
//编写一个算法来判断一个数 n 是不是快乐数。 //「快乐数」 定义为: //对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。 //然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。 //如果这个过程 结果为 1,那么这个数就是快乐数。 //如果 n 是 快乐数 就返回 true ;不是,则返回 false 。 //--无限循环-->重复出现数字:可以用contains方法判断是否无限循环 思路相同还是看处理的数据中是否含有某个数,用集合方法处理 public boolean isHappy(int n) { HashSet<Integer> Number=new HashSet<>(); int sum=n; while(!Number.contains(sum)&&sum!=1){ Number.add(sum); sum=getSum(sum); } return sum==1; } public int getSum(int n){ int sum=0,tmp; while(n>0){ tmp=n%10; n/=10; sum+=tmp*tmp; } return sum; }
//给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 //你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 //你可以按任意顺序返回答案。
要返回对应元素下标,比对的是元素的数值,用map方便存储。
遍历数组,然后查看target与当前数组的值的差是否在map中存储,若存储即返回当前下标和差值数据的下标;未找到就添加到map中,继续遍历数组。
public int[] twoSum2(int[] nums, int target) { HashMap<Integer,Integer> map=new HashMap<>(); int[] result=new int[2]; for(int i=0;i<nums.length;i++){ if (map.containsKey(target-nums[i])){ result[0]=i; result[1]=map.get(target-nums[i]); return result; } map.put(nums[i],i); } return null; }