Middle+
Java-ൽ ചുമതലകൾ 1. രീതിയുടെ നടപ്പാക്കൽ എഴുതുക: /** * @param a – സംഖ്യകളുടെ നിര, നിരയുടെ നീളം 10 ദശലക്ഷത്തിലധികം ആയിരിക്കാം. * @return സംഖ്യകളുടെ നിര, പുനരാവർത്തനങ്ങളില്ലാതെ. ഒറിജിനൽ നിരയിലെ സംഖ്യകളുടെ ക്രമം നിലനിർത്തണം. പുനരാവർത്തനങ്ങൾ ഉണ്ടെങ്കിൽ, അവസാനത്തെ ഘടകം തന്നെ നിലനിർത്തണം, ഉദാഹരണത്തിന്, {2,1,4,2,3} എന്നതിന് ശരിയായ പരിഹാരം {1,4,2,3} ആണ്, {2,1,4,3} അല്ല. ഇൻപുട്ട് നിരയിൽ 0-ൽ കുറവുള്ള ഘടകം ഉണ്ടെങ്കിൽ, പിശക് ഉണ്ടാക്കണം. ഉദാഹരണത്തിന്, {2,3,-1,5} എന്നതിന് പ്രക്രിയ പിശകോടെ അവസാനിക്കണം. */ public static double[] task(double[] a) { }
sobes.tech AI
პასუხი AI-სგან
Для решения задачи нужно:
- Проверить, что в массиве нет отрицательных чисел, иначе выбросить исключение.
- Определить для каждого числа его последнее вхождение в массив.
- Пройтись по массиву и оставить только те элементы, индекс которых совпадает с последним вхождением.
Так как массив может быть очень большим (более 10 млн элементов), важно использовать эффективные структуры данных и алгоритмы с линейной сложностью.
Пример реализации на Java:
import java.util.*;
public static double[] task(double[] a) {
// Проверка на отрицательные элементы
for (double num : a) {
if (num < 0) {
throw new IllegalArgumentException("Массив содержит отрицательное число: " + num);
}
}
// Сопоставляем число с его последним индексом
Map<Double, Integer> lastIndexMap = new HashMap<>();
for (int i = 0; i < a.length; i++) {
lastIndexMap.put(a[i], i);
}
// Собираем результат, оставляя только элементы, индекс которых совпадает с последним вхождением
List<Double> resultList = new ArrayList<>();
for (int i = 0; i < a.length; i++) {
if (lastIndexMap.get(a[i]) == i) {
resultList.add(a[i]);
}
}
// Преобразуем список обратно в массив
double[] result = new double[resultList.size()];
for (int i = 0; i < result.length; i++) {
result[i] = resultList.get(i);
}
return result;
}
Такой подход сохраняет порядок элементов и оставляет только последние вхождения дубликатов.