Почему я получаю сообщение об ошибке в цикле, который повторяется на одной конкретной итерации каждый раз во время выполнения?(Проблема бинарных запросов от HackerEarth) - PullRequest
0 голосов
/ 22 сентября 2018

Я пытаюсь решить этот вопрос: двоичные запросы,
https://www.hackerearth.com/practice/data-structures/arrays/1-d/practice-problems/algorithm/range-query-2/

Краткое содержание вопроса: дано N цифр двоичных чисел;Затем задаются Q запросов.Два типа запросов: «0 X»: перевернуть X-й бит «1 LR»: вывести, если двоичное нет.формируется из L в R (положение) нечетное или четное.

Простое решение - проверить только самый правый бит;если это 1, число нечетное, иначе, четное.

Мой код выдает «Неправильный ответ» каждый раз;однако, во всех тестовых случаях есть только один неправильный вывод, и этот неправильный вывод происходит ровно за 99 строк до общего числа выходных строк *.Похоже, другого шаблона не существует.

* Я попытался перевернуть вывод, когда достигну (Q-99) -ого запроса для проверки;однако невозможно найти количество выходных запросов без сохранения всех запросов, поскольку тип запроса [0] не имеет выходных данных, а только тип 1 имеет выходные данные.Таким образом, нельзя использовать Q.

Изображения: Сбой всех тестовых случаев Пример 1. Единственная строка ошибки Пример 2. Другой пример .

Вот мой код:

public static void main(String args[]) throws IOException
{
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    String inpArr[] = (br.readLine().split("\\s"));
    int n=Integer.parseInt(inpArr[0]);              //number of digits
    int q=Integer.parseInt(inpArr[1]);              //number of queries
    //read binary digits w/o space, and store them as chars
    String binArrStr=br.readLine().replace(" ",""); 
    char[] binArr=binArrStr.toCharArray();          
    int i;

    for(i=0;i<q;i++)                                //all queries
    {
        String query[]=br.readLine().split("\\s");           //read the query 
        if(query[0].equals("1"))                            //Flip the bit if query[0]=1
        {
            if(binArr[Integer.parseInt(query[1])-1]=='1')    //take position(query[1]) as int and flip
                binArr[Integer.parseInt(query[1])-1]='0';
            else
                binArr[Integer.parseInt(query[1])-1]='0';
        }
        else                                               //Print odd or even if query[0]=0
        {
            //query[1] is leftmost bit.
            //Sufficient to check only the bit in rightmost position, given by 
            //3rd argument(Rightmost bit) which is query[2]
            //If rightmost bit==1, ODD, else EVEN
            if(binArr[Integer.parseInt(query[2])-1]=='1')   
                System.out.println("ODD");
            else
                System.out.println("EVEN");
        }
    }

}

Я мог бы пропустить эту проблему, но лучше знать, почему именно это происходит, я думаю.

1 Ответ

0 голосов
/ 22 сентября 2018
   if(query[0].equals("1"))                            //Flip the bit if query[0]=1
    {
        if(binArr[Integer.parseInt(query[1])-1]=='1')    //take position(query[1]) as int and flip
            binArr[Integer.parseInt(query[1])-1]='0';
        else
            binArr[Integer.parseInt(query[1])-1]='0';
 }

в вашем операторе if вы проверили, что если оно равно 1, то установите его на 0, но в вашем блоке else вы не перевернете число на 1, потому что блок else будет действовать, если число равно 0. Следовательно, вытолько частичное переворачивание.

Вот мое решение

import java.util.Scanner;

class TestClass {public static void main (String args []) выдает Exception {

    Scanner scan = new Scanner(System.in);
    int n = scan.nextInt();
    int q = scan.nextInt();
    int[] bits = new int[n + 1];
    for (int i = 1; i <= n; i++) {
        bits[i] = scan.nextInt();
    }

    for (int i = 1; i <= q; i++) {
        if (scan.nextInt() == 1) {
            int index = scan.nextInt();
            if (bits[index] == 0) bits[index]++;
            else bits[index]--;
        } else {
            int lIndex = scan.nextInt();
            int rIndex = scan.nextInt();
            System.out.println(bits[rIndex] == 0 ? "EVEN" : "ODD");
        }
    }


}

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...