В двух словах. Считываю в массив байты из файла. в новый архив закидываю байты без повторов, посчитав количество вхождений для каждого из низ (третий массив). в третьем массиве ищу минимум. вывожу на экран из второго массива те элементы, индекс которых равен индексам минимальных значений из третьего массива.
package com.javarush.task.task18.task1804;
/*
Самые редкие байты
*/
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Iterator;
public class Solution {
public static void main(String[] args) throws Exception {
ArrayList<Integer> bytes = new ArrayList<>();
FileInputStream fis = new FileInputStream(new BufferedReader(new InputStreamReader(System.in)).readLine());
while (fis.available() > 0) {
bytes.add(fis.read());
}
fis.close();
ArrayList<Integer> vkh = new ArrayList<>();
ArrayList<Integer> newBytes = new ArrayList<>();
for (int i = 0; i < bytes.size(); i++) {
int v = 0;
int b = bytes.get(i);
if (!newBytes.contains(b)) {
for (int j = 0; j < bytes.size(); j++) {
if (b == bytes.get(j)) v++;
}
newBytes.add(b);
vkh.add(v);
}
}
int min = vkh.get(0);
for (int i = 1; i < vkh.size(); i++) {
if (vkh.get(i) < min) min = vkh.get(0);
}
for (int i = 0; i < vkh.size(); i++) {
if (vkh.get(i) == min) System.out.print(newBytes.get(i) + " ");
}
}
}