برنامه نویسی

بشمار

بین لوله ها (|)

بیان مشکل: تعداد ستاره ها بین لوله ها

شرح مشکل s یک رشته به شما داده می شود

  • متشکل از دو نوع کاراکتر:'|'لوله ها (
  • ) نشان دهنده تقسیم کننده ها است.'*'ستاره ها (

) نشان دهنده اقلام است. aعلاوه بر این، لیستی از محدوده ها به شما داده می شود [i, j]، که در آن هر محدوده به عنوان یک آرایه نمایش داده می شود'*'. برای هر محدوده، باید تعداد ستاره ها را بشمارید ( ) که هستند بین اولین و آخرین لوله محصور شده است

در محدوده 0اگر هیچ جفت لوله معتبری در یک محدوده وجود نداشته باشد، نتیجه برای آن محدوده باید باشد


.

  1. ورودی sرشته '*' : رشته ای غیر خالی که فقط شامل کاراکترها است '|'و
  2. . 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;
    }
}
از حالت تمام صفحه خارج شوید

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا