牛客_数轴机器人移动

题目描述:

在一根数轴上,1-n的每个点上都标有'L',或者'R',最初每一个点上都有一个机器人,如果该点上标有'L’,则机器人左移,如果该点上标有'R'则机器人右移,移动操作10的100次方次。

保证1上的为'R‘,点n上的为'L',求最终每一个点上有多少个机器人。

输入描述:输入包括一根只包含'R',和‘L’字符串s,表示初始化的时候每个点的标记。

2<=|s|<=10的5次方,其中|s|表示字符串的长度。

测试样例:

输入一: RRLRL

输出为:01211

输入二:RRRRRLRLRL

输出:0000331111

思路:首先题目中的就是字符串的来回移动,遇到R就右移,遇到L就左移,而且移动次数10的100次方是一个无穷大的偶数

也就是当一个R的时候会右移,直到遇到右边的第一个L的时候就会在这两个RL之间来回移动,最终看是奇偶的情况

比如RRLRL:

牛客_数轴机器人移动_第1张图片

所以就是需要将输入的数轴字符进行遍历,找到R的左边第一个L的位置的距离,

//定义一个k用来记录R的右边第一个L的下标位置,从i+1开始寻找

//定义一个x用来记录L的左边第一个R的下标位置,从i-1开始寻找

不用担心会出现数组越界,因为判断条件中已经限制了从0到i,题干中也说明了,第一个一定为R,最后一个一定为L

import java.util.Scanner;
public class Solution1_zhonghang {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String[] string = scanner.nextLine().split("");
        int lengh = string.length;
        int[] out = new int[lengh];
        for (int i = 0; i < lengh; i++) {
            //找到R的右边第一个L
            if (string[i].equals("R")) {
                //定义一个k用来记录R的右边第一个L的下标位置,从i+1开始寻找
                int k = i + 1;
                //此处匹配使用R,其实是如果R的右边找不到L就继续往右边找,直到找到第一个L为止
                while (k < lengh && string[k].equals("R")) {
                    k++;
                }
                //判断第一个出现的L和当前R的距离是不是偶数,如果是偶数就将第一个L的值+1,
                // 否则将前面一个R的的值+1
                if ((k - i) % 2 == 0) {
                    out[k]++;
                } else {
                    out[k - 1]++;
                }
            } else {
                //当前为L的时候,寻找左边的第一个R,的位置
                //或者找到左边第一个R
                //定义一个x用来记录L的左边第一个R的下标位置,从i-1开始寻找
                int x = i - 1;
                while (x >= 0 && string[x].equals("L")) {
                    x--;
                }
                if ((i - x) % 2 == 0) {
                    out[x]++;
                } else {
                    out[x + 1]++;
                }
            }
        }
        //遍历输出数组
        for (int v : out) {
            System.out.println(v);
        }
    }
}

需要注意的是

①如何判断RL之间的距离,因为尽管k、x都在右移和左移,但是他们和i的距离就是当前字符和目标自己的距离

②String类型的比较,“==”在引用类型的比较的是引用数据类型传递的是对象所在堆地址的拷贝 ,需要使用.equlas

或者使用 charAt方法将string转char再进行字符比较

import java.util.Scanner;
public class Solution1_zhonghang {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
//        String[] string = scanner.nextLine().split("");
        String s=scanner.next().trim();
        int len=s.length();
//        int lengh = string.length;
        int[] out = new int[len];
        for (int i = 0; i < len; i++) {
            char c = s.charAt(i);
            //找到R的右边第一个L
            if (c=='R') {
                //定义一个k用来记录R的右边第一个L的下标位置,从i+1开始寻找
                int k = i + 1;
                //此处匹配使用R,其实是如果R的右边找不到L就继续往右边找,直到找到第一个L为止
                while (k < len && s.charAt(k)!='L') {
                    k++;
                }
                //判断第一个出现的L和当前R的距离是不是偶数,如果是偶数就将第一个L的值+1,
                // 否则将前面一个R的的值+1
                if ((k - i) % 2 == 0) {
                    out[k]++;
                } else {
                    out[k - 1]++;
                }
            } else {
                //当前为L的时候,寻找左边的第一个R,的位置
                //或者找到左边第一个R
                //定义一个x用来记录L的左边第一个R的下标位置,从i-1开始寻找
                int x = i - 1;
                while (x >= 0 && s.charAt(x)!='R') {
                    x--;
                }
                if ((i - x) % 2 == 0) {
                    out[x]++;
                } else {
                    out[x + 1]++;
                }
            }
        }
        //遍历输出数组
        for (int v : out) {
            System.out.println(v);
        }
    }
}

测试:

牛客_数轴机器人移动_第2张图片

 

你可能感兴趣的:(牛客&Leetcode)