赎金信
要点:map
java
class Solution {
public boolean canConstruct(String ransomNote, String magazine) {
Map<Character,Integer> map1 = new HashMap<>();
for(int i = 0; i < ransomNote.length(); i++){
map1.put(ransomNote.charAt(i), map1.getOrDefault(ransomNote.charAt(i),0) + 1);
}
Map<Character,Integer> map2 = new HashMap<>();
for(int i = 0; i < magazine.length(); i++){
map2.put(magazine.charAt(i), map2.getOrDefault(magazine.charAt(i),0) + 1);
}
for(int i = 0; i < ransomNote.length(); i++){
char c = ransomNote.charAt(i);
if(map2.get(c) == null){
return false;
}
if(map1.get(c) > map2.get(c)){
return false;
}
}
return true;
}
}
生命游戏
要点:纯模拟
java
class Solution {
public void gameOfLife(int[][] board) {
int[] neighbors = {0, 1, -1};
int rows = board.length;
int cols = board[0].length;
// 创建复制数组 copyBoard
int[][] copyBoard = new int[rows][cols];
// 从原数组复制一份到 copyBoard 中
for (int row = 0; row < rows; row++) {
for (int col = 0; col < cols; col++) {
copyBoard[row][col] = board[row][col];
}
}
// 遍历面板每一个格子里的细胞
for (int row = 0; row < rows; row++) {
for (int col = 0; col < cols; col++) {
// 对于每一个细胞统计其八个相邻位置里的活细胞数量
int liveNeighbors = 0;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (!(neighbors[i] == 0 && neighbors[j] == 0)) {
int r = (row + neighbors[i]);
int c = (col + neighbors[j]);
// 查看相邻的细胞是否是活细胞
if ((r < rows && r >= 0) && (c < cols && c >= 0) && (copyBoard[r][c] == 1)) {
liveNeighbors += 1;
}
}
}
}
// 规则 1 或规则 3
if ((copyBoard[row][col] == 1) && (liveNeighbors < 2 || liveNeighbors > 3)) {
board[row][col] = 0;
}
// 规则 4
if (copyBoard[row][col] == 0 && liveNeighbors == 3) {
board[row][col] = 1;
}
}
}
}
}
同构字符串
要点:两个哈希
java
class Solution {
public boolean isIsomorphic(String s, String t) {
//两个哈希表
Map<Character, Character> sTot = new HashMap<>();
Map<Character, Character> tTos = new HashMap<>();
for(int i = 0; i < s.length(); i++){
char st = s.charAt(i);
char tt = t.charAt(i);
if((sTot.containsKey(st) && sTot.get(st) != tt) || (tTos.containsKey(tt) && tTos.get(tt) != st)){
return false;
}
sTot.put(st, tt);
tTos.put(tt,st);
}
return true;
}
}
单词规律
要点:split,也是两个hashmap对应两个类型的映射
java
class Solution {
public boolean wordPattern(String pattern, String s) {
String[] words = s.split(" ");
if (pattern.length() != words.length) {
return false;
}
Map<Character, String> charToWord = new HashMap<>();
Map<String, Character> wordToChar = new HashMap<>();
for (int i = 0; i < pattern.length(); i++) {
char c = pattern.charAt(i);
String word = words[i];
// 检查 char → word
if (charToWord.containsKey(c) && !charToWord.get(c).equals(word)) {
return false;
}
// 检查 word → char
if (wordToChar.containsKey(word) && wordToChar.get(word) != c) {
return false;
}
charToWord.put(c, word);
wordToChar.put(word, c);
}
return true;
}
}
有效的字母异位词
要点: int【】char = new interesting【26】 c - 'a'
java
class Solution {
public boolean isAnagram(String s, String t) {
//字母对应的
int[] cnt = new int[26];
for(char c : s.toCharArray()){
cnt[c - 'a']++;
}
for(char c : t.toCharArray()){
cnt[c - 'a']--;
}
for(int num : cnt){
if(num != 0){
return false;
}
}
return true;
}
}
字母异位词分组
要点:str排序,map
java
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
//每个str排序然后<key,value>
Map<String ,List<String>> map = new HashMap<>();
for(String str : strs){
char[] c = str.toCharArray();
Arrays.sort(c);
String csort = new String(c);
if(map.containsKey(csort)){
List<String> ans = map.get(csort);
ans.add(str);
map.put(csort,ans);
}else{
List<String> ans = new ArrayList<>();
ans.add(str);
map.put(csort,ans);
}
}
return new ArrayList<List<String>>(map.values());
}
}
快乐数
要点:set破除循环
java
class Solution {
public boolean isHappy(int n) {
//破循环
Set<Integer> seen = new HashSet<>();
while(n != 1 && !seen.contains(n)){
seen.add(n);
int next = Sqrt(n);
n = next;
}
return n==1;
}
public int Sqrt(int n){
int sum = 0;
while(n > 0){
int m =n%10;
sum += m*m;
n = n/10;
}
return sum;
}
}
存在重复元素 II
要点:map记录最左边的数,因为是<k
java
class Solution {
public boolean containsNearbyDuplicate(int[] nums, int k) {
//小于记录最左边的就行了
Map<Integer,Integer> map = new HashMap<>();
for(int i = 0 ; i < nums.length ; i++){
if(!map.containsKey(nums[i])){
map.put(nums[i], i);
}else{
int start = map.get(nums[i]);
map.put(nums[i],i);
if(i - start <= k){
return true;
}
}
}
return false;
}
}
最长连续序列
要点:set,找没有num--1的num开始找
javaclass Solution { public int longestConsecutive(int[] nums) { if(nums.length == 0 || nums ==null){ return 0; } Set<Integer> set = new HashSet<>(); for(int num : nums){ set.add(num); } int max = 1; //在去重的数组里面做 for(int num : set){ if(set.contains(num-1)){ continue; }else{ int temp =num; int jishu =1; while(set.contains(temp+1)){ jishu++; temp++; } max = Math.max(jishu,max); } } return max; } }
碎碎念:后续会更新每天学习的八股和算法 题,开始准备秋招的第37天。努力连续更新100天!以后每天就按,秋招项目【java +agent】,科研,必做项目,算法,八股,锻炼身体来总结。
总结:要掌控好自己的时间
1.算法面试150 69/150【早中晚】2h
2.秋招项目,【java 项目】,1/6;无
【agent 项目 】1/6,无,
3.科研要跑一下,无
4.检测项目,准备数据集【5.5h】
6.背八股,【】
7.锻炼身体,【1h】
然后写简历写了2h,吹牛的感觉真不错呀哈哈哈哈
反思:争取能被拷打完成,简历内容要多做准备