力扣面试150题--生命游戏和赎金信

发布于:2025-04-18 ⋅ 阅读:(74) ⋅ 点赞:(0)

Day 22

题目描述

在这里插入图片描述

思路

题目要求原地完成更新,那么就存在问题,假如一个元素更新时,它周围的八个元素中存在从活到死或者从死到活的更新,就很导致该元素的更新错误,于是根据分析题目的四种更新策略,可以这么定于:
活->死 用3来表示
活->活 用1表示
死->活 用4来表示
死->死 用0来表示
在判断某元素更新时,如果周围元素为1或者为3都说明这个元素是活的,如果周围元素不存在或者为0,4说明这个元素是死的。最后整体更新,将数组中的3变为1,4变为0即可

class Solution {
    public void gameOfLife(int[][] board) {
         //设定新的状态值
    //活变死为3
    //死变活为4
    int sum=0;
        for (int i = 0; i < board.length; i++) {
            for (int j = 0; j < board[i].length; j++) {
                sum=0;//统计周边八个活细胞的数量
                if(i-1>=0){
                    if(board[i-1][j]==1||board[i-1][j]==3){
                        sum++;
                    }
                    if(j-1>=0&&(board[i-1][j-1]==1||board[i-1][j-1]==3)){
                        sum++;
                    }
                    if(j+1<board[i].length&&(board[i-1][j+1]==1||board[i-1][j+1]==3)){
                        sum++;
                    }
                }
                if(j-1>=0&&(board[i][j-1]==1||board[i][j-1]==3)){
                    sum++;
                }
                if(j+1<board[i].length&&(board[i][j+1]==1||board[i][j+1]==1)){
                    sum++;
                }
                if(i+1<board.length){
                    if(j-1>=0&&(board[i+1][j-1]==1||board[i+1][j-1]==3)){
                        sum++;
                    }
                    if(j+1<board[i].length&&(board[i+1][j+1]==1||board[i+1][j+1]==3)){
                        sum++;
                    }
                    if (board[i+1][j]==1||board[i+1][j]==3){
                        sum++;
                    }
                }
                if(board[i][j]==1){//该细胞为活
                    if(sum<2||sum>3){//活-》死的条件
                        board[i][j]=3;
                    }
                }
                else{
                    if(sum==3){//死-》活的条件
                        board[i][j]=4;
                    }
                }
            }
        }
        for (int i = 0; i < board.length; i++) {//整体更新
            for (int j = 0; j < board[i].length; j++) {
                if(board[i][j]==3){
                    board[i][j]=0;
                }
                if(board[i][j]==4){
                    board[i][j]=1;
                }
            }
        }
    }
}

题目描述

在这里插入图片描述

思路

直接将magazine中的字符依次存放到hashmap中,记录该字符的数量,依次判断ransomNote中的字符在hashmap中时候存在:
存在,判断数量是否大于等于1,大于等于1 则hashmap中数值减1,否则返回false
不存在返回false

class Solution {
    public boolean canConstruct(String ransomNote, String magazine) {
         HashMap<Character, Integer> mag = new HashMap<>();
        for (int i = 0; i < magazine.length(); i++) {
            if(mag.containsKey(magazine.charAt(i))){
                mag.put(magazine.charAt(i), mag.get(magazine.charAt(i)) + 1);
            }
            else{
                mag.put(magazine.charAt(i), 1);
            }
        }
        for (int i = 0; i < ransomNote.length(); i++) {
            if(mag.containsKey(ransomNote.charAt(i))){
                if(mag.get(ransomNote.charAt(i))>=1){
                    mag.put(ransomNote.charAt(i), mag.get(ransomNote.charAt(i))-1);
                }
                else{
                    return false;
                }
            }
            else{
                return false;
            }
        }
        return true;
    }
}

网站公告

今日签到

点亮在社区的每一天
去签到