برنامه نویسی
بشمار

بین لوله ها (|)
بیان مشکل: تعداد ستاره ها بین لوله ها
شرح مشکل s
یک رشته به شما داده می شود
- متشکل از دو نوع کاراکتر:
'|'
لوله ها ( - ) نشان دهنده تقسیم کننده ها است.
'*'
ستاره ها (
) نشان دهنده اقلام است. a
علاوه بر این، لیستی از محدوده ها به شما داده می شود [i, j]
، که در آن هر محدوده به عنوان یک آرایه نمایش داده می شود'*'
. برای هر محدوده، باید تعداد ستاره ها را بشمارید ( ) که هستند بین اولین و آخرین لوله محصور شده است
در محدوده 0
اگر هیچ جفت لوله معتبری در یک محدوده وجود نداشته باشد، نتیجه برای آن محدوده باید باشد
.
-
ورودی
s
رشته'*'
: رشته ای غیر خالی که فقط شامل کاراکترها است'|'
و -
.
a
آرایه دو بعدی[i, j]
: لیستی از محدوده ها که در آن هر محدوده به صورت یک آرایه نمایش داده می شود-
i
.j
و
-
(شاخص های مبتنی بر 0) نشان دهنده شاخص های شروع و پایان محدوده (شامل) است.
- خروجی
'*'
آرایه ای از اعداد صحیح را برگردانید که در آن هر عنصر با تعداد ستاره ها مطابقت دارد ('|'
) محصور بین اولین و آخرین لوله (a
) برای محدوده مربوطه در
.
-
1 <= s.length <= 10^5
-
1 <= a.length <= 10^4
-
0 <= i <= j < s.length
-
s
محدودیت ها'*'
فقط شخصیت ها را شامل می شود'|'
و
.
مثال
s = "|**|*|*"
a = [[0, 2], [0, 4], [1, 6]]
از حالت تمام صفحه خارج شوید
[0, 2, 3]
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) {
String s = "|**|*|*";
int a[][]={{3,5},{0,4}};
for(int i : find(s,a)){
System.out.println(i);
}
}
public static int[] find(String s , int [][] a){
int prefix[] = new int[s.length()];
int left[] = new int[s.length()];
int right[] = new int[s.length()];
int leftPipe = -1;
int count = 0;
for(int i =0;i<s.length();i++){
if(s.charAt(i)=='|'){
leftPipe = i;
}
left[i] = leftPipe;
if(s.charAt(i)=='*'){
count++;
}
prefix[i] = count;
}
int rightPipe = -1;
for(int i =s.length()-1;i>=0;i-- ){
if(s.charAt(i)=='|'){
rightPipe = i;
}
right[i] = rightPipe;
}
int index = 0;
int result[] = new int[a.length];
for(int range[] : a){
int i = range[0];
int j = range[1];
//since we have to find * between i and j
//we have to find the nearest | after i and nearest | before j
int l = right[i]; // nearest | after i, we can get in right[i]
int r = left[j];// nearest pipe before j we can get in left[j]
if(l!=-1 && r!=-1 && l<r){ // make sure the pipe indexes are valid
result[index] = prefix[r]-prefix[l];// get the * count between the pipes
}
index++;
}
return result;
}
}
از حالت تمام صفحه خارج شوید