Skip to main content
Code Review

Return to Revisions

5 of 6
Summarized challenge; edited tags; edited title
200_success
  • 145.5k
  • 22
  • 190
  • 478

HackerEarth Girlfriend's Demand challenge, solved two ways

I solved the Girlfriend's Demand challenge on HackerEarth. In summary:

Input: First line of the input contains a string S. Next line contains an integer Q, the number of queries. Each of the next Q lines contains a test case consisting of 2 integers, a and b.

Output: If S is repeated infinitely, would string positions a and b contain the same character (using 1-based indexing)? For each query, print "Yes" or "No".

Constraints:

  • 1 ≤ |S| ≤ 105
  • 1 ≤ Q ≤ 105
  • 1 ≤ a, b ≤ 1018

Sample Input:

vgxgp 
3 
2 4 
2 5 
7 14 

Sample Output:

Yes 
No 
Yes

My first solution:

public static void main(String args[] ) throws Exception {
 BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
 String item=br.readLine();
 
 StringBuffer sb=new StringBuffer();
 int len = item.length();
 int inputs = Integer.parseInt(br.readLine());
 
 while(inputs-->0)
 {
 String strarr[] =null;
 
 strarr = br.readLine().split(" ");
 
 long a=Long.parseLong(strarr[0]);
 long b=Long.parseLong(strarr[1]);
 a=a-1;
 b=b-1;
 a=a%len;
 b=b%len;
 
 if(item.charAt((int)a)==item.charAt((int)b))
 sb.append("Yes\n");
 else
 sb.append("No\n");
 
 
 }
 
 System.out.println(sb);
 
 
 }

While this gave me an output in almost 5.2954 seconds for various inputs, when I tried the same inputs on this version of the code that I wrote:

public static void main(String args[] ) throws Exception {
 BufferedReader reader= new BufferedReader(new InputStreamReader(System.in));
 String demanded=reader.readLine();
 int length = demanded.length();
 int T=Integer.parseInt(reader.readLine());
 for(int i = 0;i < T; i++){
 String[] pairedAAndB=reader.readLine().split(" ");
 long a = ((Long.parseLong(pairedAAndB[0]) - 1) % length);
 long b = ((Long.parseLong(pairedAAndB[1]) -1) %length);
 System.out.println((demanded.charAt((int)a)==demanded.charAt((int)b)) ? "Yes" : "No");
 
 }
 
}

It took around 15.7819 seconds. What is the best way to convert long to int optimally? What I'm not able to understand is why the second code snippet is taking so much time when the second version is almost similar. There must be something about the second version that I'm not able to understand.

Ankur Anand
  • 686
  • 1
  • 8
  • 18
lang-java

AltStyle によって変換されたページ (->オリジナル) /