Если это домашнее задание, ваша проблема здесь:
for (int j = i - 1; j >= 0; j--) {
if (binaryNum[j] == 0) {
k = j;
do {
ctr++;
k++;
} while (binaryNum[k] == 0);
al.add(ctr);
ctr = 0;
}
}
Обратите внимание:
- Вы обновляете
k
по мере продвижения, но вы этого не делаетеобновите j
, чтобы вы получали 1 через любое правильное значение ([1, 2, 3, 4, 5, 1, 2, 3]
вместо [5, 3]
). - Вам вообще не нужно
k
.
for (int j = i - 1; j >= 0; j--) {
if (binaryNum[j] == 0) {
int ctr = 0;
while (binaryNum[j] == 0) {
ctr++;
j--;
}
al.add(ctr);
}
}
Здесь показано .
Если вы не делаете это для домашней работы и вам нужна производительность для реального использования, используйте Javaвстроенные побитовые методы в Integer
классе , которые используют очень и очень быстрые инструкции CPU для процессоров, у которых они есть:
import java.util.Arrays;
public class Abc {
static final int[] gaps(int n) {
final int[] untrimmedResult = new int[15];
int i = 0;
// Remove trailing zeroes and last one bit to get to first gap.
n >>>= Integer.numberOfTrailingZeros(n) + 1;
while (n != 0) {
final int gapSize = Integer.numberOfTrailingZeros(n);
untrimmedResult[i++] = gapSize;
n >>>= gapSize + 1;
}
final int[] result = new int[i];
System.arraycopy(untrimmedResult, 0, result, 0, i);
return result;
}
// driver program
public static void main(final String[] args) {
final int n = 1041;
System.out.println(Integer.toBinaryString(n));
System.out.println(Arrays.toString(gaps(n)));
}
}
Это , показанное здесь для работы, хотя это дает результаты в обратном порядке (что можно легко исправить, заполнив untrimmedResult
в обратном порядке и правильно настроив аргументы System.arraycopy
).