图片说明

int game(int* guess, int guessSize, int* answer, int answerSize){
    int ans = 0 ;
    for (int i = 0 ; i < guessSize ; i++){
        if(answer[i]==guess[i])
            ans++;
    }
    return ans;
}

图片说明

class Solution {
    static long gcd(long a , long b){
        long c = a % b;
        if(c == 0)return b;
        return gcd(b ,c );
    }
    public int[] fraction(int[] cont) {
        int len = cont.length-1;
        long temp1 = cont[len--];
        long temp2 = 1;
        int ans [] = new int [2];

        while(len>= 0){
            long flag = temp1 * cont[len] +temp2;     //核心一步
            temp2 = temp1;                            //核心一步
            temp1 = flag ;                            //核心一步
            len--;
        }
        long gcd = gcd(temp1 , temp2);
        ans[0] = (int)(temp1 / gcd);
        ans[1] = (int)(temp2 / gcd);
        return ans;
    }
}

图片说明
第三题第一种做法 超时

class Solution {
    public boolean robot(String command, int[][] obstacles, int x, int y) {
        boolean [][] bool = new boolean [x+1][y+1];
        for(int i = 0 ; i < obstacles.length ; i ++){
            int x1 = obstacles[i][0];
            int y1 = obstacles[i][1];
            if(x1<=x&&y1<=y)
                bool[x1][y1] = true;
        }
        int x2 = 0 ;
        int y2 = 0 ;
        int flag = 0;
        int len = command.length();
        while(x2 < x && y2 < y){
            char temp = command.charAt(flag%len);
            if(temp == 'U')y2++;
            if(temp == 'R')x2++;
            if(bool[x2][y2]==true)return false;
            flag ++;
        }

        while(x2 < x){
            char temp = command.charAt(flag%len);

            if(temp == 'U')return false;
            if(temp == 'R')x2++;
            flag ++;
        }

        while( y2 < y){
            char temp = command.charAt(flag%len);
            if(temp == 'U')y2++;
            if(temp == 'R')return false;
            flag ++;
        }

        if(x2==x&&y2==y)return true;
        return false;
    }
}

第二种做法 ac 优化第一种

class Solution {
    public boolean robot(String command, int[][] obstacles, int x, int y) {
        Map<Integer,Set<Integer>>map = new HashMap();
        for(int i = 0 ; i < obstacles.length ; i ++){
            int a = obstacles[i][0];
            int b = obstacles[i][1];
            if (!map.containsKey(a)) map.put(a, new HashSet<>()); 
            map.get(a).add(b);
        }
        int r = 0, u = 0;
        while (true) {
            for (char ch: command.toCharArray()) {  //这一步处理得很好
                if (r == x && u == y) return true;
                switch (ch) {
                    case 'U': ++u; break;
                    case 'R': ++r; break;
                }
                if (map.containsKey(r) && map.get(r).contains(u)) return false;
                if (r > x || u > y) return false;
            }
        }
    }
}

第三种解法 比较实际点 判断前面障碍是否能达到,判断终点是否能到达

class Solution {
    private static char command_char[];
    private static int command_R;
    private static int command_U;
    public boolean robot(String command, int[][] obstacles, int x, int y) {
        init(command);
        if(!arrive(x,y))return false;
        for(int i = 0 ; i < obstacles.length ;i++){
            int dx = obstacles[i][0];
            int dy = obstacles[i][1];
            if(dx <= x && dy <= y&&arrive(dx,dy)) return false;
        }
        return true;
    }
    private static boolean arrive(int dx , int dy){
        int t = Math.min(dx/command_R,dy/command_U);
        dx -= t* command_R;
        dy -= t* command_U;
        if(dx==0&&dy==0)return true;
        for(char c : command_char ){
            if(c == 'U')dy--;
            else dx--;
            if(dx==0&&dy==0)return true;
        }
        return false;
    }
    private static void init(String command){
        command_R = 0;
        command_U = 0;
        command_char = command.toCharArray();
        for(char c :command_char){
            if(c=='U'){
                command_U++;
            }
            else command_R++;
        }
    }
}