Cita: En el primer caso, no defino el arreglo con la menor cantidad de elementos porque en el arreglo resultados me quedarían elementos con valor 0.
Como ya te he dicho
Cita: Tu actual algoritmo tampoco devuelve un array donde todas las posiciones estén ocupadas.
Aparte de que cuentas mal las repeticiones, por cada 5 en a, sumas el número de cincos en b.
int [] a = {5,4,5,3};
int [] b = {3,5,5};
Devuelve
[5, 3, 0, 0, 0]
Cita: En el segundo caso, no se la cantidad de elementos repetidos, por lo tanto no puedo especular si son 1, 5, 25 o 50.
No me refería al número de repetidos, si no al rango de valores que se van a comparar. Si tus arrays solo continenen números del 0 al 9, te llegaría con un array de 10 posiciones. Pero tendrías el mismo "problema" de posiciones vacías, que es algo que no especificaste en el primer post.
Lo correcto sería usar Set, que para eso son arrays dinámicos (sin tamaño definido) y sin repetición, pero si uno de los requisitos es que uses arrays estáticos, cada vez que insertes un valor repetido aumentas contadorRepetidos, cuando acabes creas un nuevo array de ese tamaño y copias en él los valores distintos de 0 del array resultados, sería más eficiente que recorrer el producto cartesiano de dos arrays como haces ahora.
Para hacer un buen algoritmo, es muy recomendable hacer primero una lista con todas las limitaciones.