在一根数轴上,1-n的每个点上都标有'L',或者'R',最初每一个点上都有一个机器人,如果该点上标有'L’,则机器人左移,如果该点上标有'R'则机器人右移,移动操作10的100次方次。
保证1上的为'R‘,点n上的为'L',求最终每一个点上有多少个机器人。
2<=|s|<=10的5次方,其中|s|表示字符串的长度。
输入一: RRLRL
输出为:01211
输入二:RRRRRLRLRL
输出:0000331111
思路:首先题目中的就是字符串的来回移动,遇到R就右移,遇到L就左移,而且移动次数10的100次方是一个无穷大的偶数
也就是当一个R的时候会右移,直到遇到右边的第一个L的时候就会在这两个RL之间来回移动,最终看是奇偶的情况
比如RRLRL:
所以就是需要将输入的数轴字符进行遍历,找到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);
}
}
}
测试: