Как оптимизировать следующий код в java, где я должен получить побитовое ИЛИ двух очень длинных двоичных строк? - PullRequest
1 голос
/ 16 марта 2020

Я написал следующий код, чтобы получить поразрядно или из двух строк. Но это слишком долго, когда я прохожу длинные строки. Как я могу оптимизировать это?

 static String or_str(String s1, String s2){
            String result="";
            for(int i=0; i<s1.length(); i++){
                if(s1.charAt(i)=='1'||s2.charAt(i)=='1')
                result+="1";
            }
            return result;
        }

Ответы [ 2 ]

2 голосов
/ 16 марта 2020

Если вам нужно только их количество, как можно найти в комментариях, вы можете использовать пример следующим образом:

static int countBitwiseOr(String s1, String s2) {
    int result = 0;
    for (int i = 0; i < s1.length(); i++) {
        if (s1.charAt(i) == '1' || s2.charAt(i) == '1')
            result += 1;
    }
    return result;
}

, чтобы избежать большого количества вычислений.

Редактировать предлагаемое решение для соответствия API, предложенное в комментариях

Если вам нужно восстановить соответствие API (вернуть строку, содержащую все положительные результаты), вы все равно можете:

с Java 11

 static String or_str(String s1, String s2){
    return "1".repeat(countBitwiseOr(s1,s2));
 }

с Java 11

 static String or_str(String s1, String s2){
   return Stream.generate(() -> "1").limit(countBitwiseOr(s1,s2)).collect(joining());
 }
0 голосов
/ 16 марта 2020

Если вы хотите получить реальное побитовое «ИЛИ», вам также необходимо вывести ноль, если ваше условие не соответствует. Если вы хотите улучшить производительность, вы знаете длину вывода, поэтому вместо создания новой строки на каждой итерации вы можете использовать массив символов с заранее определенной длиной с самого начала.

Вот простая реализация побитового или для строк, которые возвращают строку:

public static void main(String[] args) {
    String s1 = "1011010100100101110";
    String s2 = "011011101101001000100110001";
    System.out.println(or_str(s1, s2));
}

static String or_str(String s1, String s2){
    char[] res = new char[s1.length()];
    for(int i=0; i<s1.length(); i++){
        if(s1.charAt(i)=='1'||s2.charAt(i)=='1')
            res[i] ='1';
        else
            res[i] ='0';
    }
    return new String(res);
}

Если вы запустите это, вывод будет:

1111111111110111111
...