今日鸡汤:Live your own life!!!
题目:
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
示例1:
输入: s = “anagram”, t = “nagaram”
输出: true
示例2:
输入: s = “rat”, t = “car”
输出: false
思路:代码随想录
创建一个长度为26的数组,通过计算字母的相对位置,给数组赋值,从而获取s中字母出现的次数(++),利用同样的道理,在判断的字符串中对相关的字符进行判断,对每个字母出现的次数在数组中出现的地方减去1(–)
(感觉自己理解,但是解释得不是很好,建议参考代码随想录中的图)
代码(Java)
class Solution {
public boolean isAnagram(String s, String t) {
int[] record=new int[26];
for(int i=0;i<s.length();i++){
record[s.charAt(i)- 'a']+=1;
}//这里必须要减去a,因为求的是相对位置,不然很有可能会越界
for(int i=0;i<t.length();i++){
record[t.charAt(i) - 'a']-=1;
}
for ( int i :record){
if( i!=0){
return false;
}
}
return true;
}
}
注意事项:
1.String.charAt(i)获取String的第i个元素
例如:
String A="aee";
int i=0;
System.out.println(A.charAt(i));
//返回的是A的第0个元素为a
2.‘e’-'a’是获取类似于一个相对位置的东西,上述式子的值为4.
3.String.length()是函数,不是属性,需要带有括号。(求求了!!注意一下细节吧)
题目:
给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
示例1:
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]
示例2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]
解释:[4,9] 也是可通过的
思路:
说来惭愧,第一次接触哈希表这样的数据结构,感觉本题更多的是调用基础函数??详细思路还是参考代码随想录吧。
(今天抽时间一定要看一下哈希表!!)
import java.util.HashSet;
import java.util.Set;
class Solution {
public 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);
}
}
将结果几何转为数组??不是很懂
return set2.stream().mapToInt(x -> x).toArray();
}
}
**题目:**编写一个算法来判断一个数 n 是不是快乐数。
「快乐数」 定义为:
对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
如果这个过程 结果为 1,那么这个数就是快乐数。
如果 n 是 快乐数 就返回 true ;不是,则返回 false 。
示例1:
输入:n = 19
输出:true
解释:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1
示例2:
输入:n = 2
输出:false
按照代码随想录给的算法,手动推导了一下过程。代码随想录快乐数题解
给定一个数,计算每一数位的平方和。
其中,取模是为了获得每一个数位上的数字,整除10是为了取更高位的数,n>0,是为了保证遍历一个数字的所有数位。
(以下的res对应下文代码中的Sum0)
class Solution {
public boolean isHappy(int n) {
Set<Integer> record=new HashSet<>();
//创建HashSet的语法
while(n!=1 && ! record.contains(n)){
record.add(n);
n=GetSum(n);
}
if(n==1){
return true;
}
return false;
}
private int GetSum(int n){
int Sum0=0;
while(n>0){
int temp=n%10;
Sum0+=temp*temp;
n=n/10;
}
return Sum0;
}
}
首先想到的当然是暴力解法
(思路没错,在本地intelliJ可以运行,但不知道为什么Leetcode上会报编译错误呜呜,可以作为暴力解法的参考吧)
public class solution {
public int[] twoSum(int[] nums, int target) {
//System.out.println(nums.length);
int[] index0=new int[2];
for(int i=0;i<nums.length;i++){
//System.out.println(nums[i]);
for(int j=0;j<nums.length;j++){
//System.out.println(nums[j]);
while(i!=j) {
//System.out.println(nums[i]+nums[j]);
if (nums[i] + nums[j] == target) {
index0[0] = i;
index0[1] = j;
}
break;
}
}
}
for (int i = 0; i < index0.length; i++) {
System.out.println(index0[i]);
}
return index0;
}
}
解法2:利用hash
(有点懵…所以先附上代码周末慢慢看)
public int[] twoSum(int[] nums, int target) {
int[] res = new int[2];
if(nums == null || nums.length == 0){
return res;
}
Map<Integer, Integer> map = new HashMap<>();
for(int i = 0; i < nums.length; i++){
int temp = target - nums[i];
if(map.containsKey(temp)){
res[1] = i;
res[0] = map.get(temp);
}
map.put(nums[i], i);
}
return res;
}
PS:
最近有那么一点点疲乏,为自己周末晚睡买单啊啊啊啊
希望自己能够更加自律一点!!