حل تمرین مجید، میلاد، رشتهسازی
در این نوشته تمرین “مجید، میلاد، رشتهسازی” که در وبسایت کوئرا موجود است را برای شما کاربران عزیز حل کردهایم.
حل تمرین مجید، میلاد، رشتهسازی
سوال تمرین
میلاد و مجید در حال ساخت یک رشته طولانی از 0 و هستند. رشته به این ترتیب ساخته میشود که در گام اول میلاد را مینویسد. از آن پس هر کس در نوبت خود رشتهای که تا الان ساخته شده است را در نظر گرفته و با تبدیل همه ها به 0 و همه 0 ها به 1، رشته حاصل را در ادامه رشته قبلی مینویسد و سپس نوبت نفر بعد میشود. و این کار را تا ابد ادامه میدهند. برای مثال، پنج نوبت اول بازی به صورت زیر است:
ابتدا میلاد 1 را مینویسد و رشته در پایان این مرحله 1 میشود. سپس مجید رشته فعلی که 1 بوده را گرفته و آن را متمم میکند و به انتهای رشته اضافه میکند در پایان این مرحله رشته به صورت 10 میشود. سپس میلاد 10 را گرفته و آن را متمم میکند و به انتهای رشته اضافه میکند و در پایان این مرحله رشته به صورت 1001 خواهد شد. سپس مجید رشته 1001 را گرفته و با متمم کردن آن و اضافه کردنش به انتهای رشته، رشته به شکل 10010110 میشود. و به همین ترتیب ساخت رشته تا ابد ادامه پیدا میکند. حال ما از شما میخواهیم با گرفتن L و R، از کاراکتر Lام تا کاراکتر Rام رشته را برای ما چاپ کنید.
ورودی تمرین
در یک خط به ترتیب L و R به شما داده میشود.
خروجی تمرین
از کاراکتر Lام تا کاراکتر Rام رشته را در یک خط و بدون فاصله چاپ کنید.
مثال تمرین
sample 1: input : 1 2 output : 10 sample 2: input : 7 10 output : 1001
کد تمرین
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// First String To run in programm
String firstString = "1";
String lastString = "1";
// Give Input
String input = sc.nextLine();
String[] tempInput = input.split(" ");
int L = Integer.parseInt(tempInput[0]);
int R = Integer.parseInt(tempInput[1]);
String temp;
for (int i = 0; firstString.length() <= R + 1; i++) {
if(i == 0) {
firstString = "10";
lastString = "01";
}
temp = lastString + firstString;
firstString += lastString;
lastString = temp;
}
System.out.println(firstString.substring(L - 1,R));
}
}
روش حل تمرین
ابتدا با کمک توابع Scanner ورودی و مقدار را از کاربر میگیریم. با توابع مربوط به Split String مقدار L و R را دریافت میکنیم و سپس یک حلقه می سازیم به اندازه ای که طول رشتهی خروجی از مقدار R کمتر شود. در بدنهی این حلقه اتصالات رشتهها و تولید آن انجام میپذیرد. نکتهی این سوال این است که رشته قبلی باید ابتدای رشتهی بعدی قرار بگیرد و رشته جدید هم در نهایت به آن بچسبد و اینکار تا مرز مشخص ادامه دارد. در نهایت هم با کمک توابع substring که در زبان جاوا برای متغیرهای رشتهای یا String قرار دارد بخش مورد نظر خود را جدا میکنید و آنرا چاپ میکنید؛ این بخش محدودهای از رشته است که از خانهی Lام تا خانهی Rام است.
منبع سوال: وبسایت کوئرا
اگر روش حل بهتری برای “تمرین مجید، میلاد، رشتهسازی” دارید برای ما ارسال کنید تا با نام خودتان به اشتراک بگذاریم. اگر سوال خاصی را مدنظر دارید در بخش نظرات برای ما ارسال کنید تا حل آن سوال را در الویت محتوای سایت بگذاریم.



















برای آزمون دستی، کوچکترین بازهای که الگوی «0011» رو تضمین میکنه کجاست؟
با سلام، سهرابی عزیز. متاسفانه الگوی “0011” در رشتههای تولید شده توسط این سوال وجود ندارد، زیرا رشتهها با “1” شروع میشوند و در هر مرحله متمم رشته قبلی به آن اضافه میشود.
موقعیتهایی که مقدار بیت عوض میشه (flip points) قانون بستهای دارن؟
سلام ندا جان، بله، نقاطی که بیتها تغییر میکنند (flip points) در این سوال الگوهای خاصی دارند که میتوانند در بهینهسازی راهحلها مفید باشند. بررسی این الگوها میتواند به درک عمیقتری از مسئله کمک کند.
الگوی متممگیری باعث میشه رشته خودمتشابه باشه؛ میشه از این خاصیت برای کمحافظه حل کردن استفاده کرد؟
بله، کاملاً درسته. با توجه به خودمتشابه بودن رشته، میتوان با استفاده از بازگشت و بدون نیاز به ذخیره کل رشته، راهحلهای کمحافظهتری ارائه داد.
آیا میشه با بازگشت و تقسیمبندی روی طولهای توانیِ دو، مستقیم به جواب بازه رسید؟
بله، آقای فتحی، استفاده از بازگشت و تقسیمبندی بر اساس طولهای توانی دو، یک راهحل بهینه و کارآمد برای این مسئله است و میتواند به طور مستقیم به جواب بازه دست یافت.
این دنباله همون دنباله معروف Thue–Morse نیست یا تفاوت ظریفی باهاش داره؟
بله، شما درست میفرمایید. این دنباله شباهت زیادی به دنباله Thue–Morse دارد، با این تفاوت که در گام اول به جای 0، عدد 1 شروع شده است.