#java #arrays
Вопрос:
Я выполняю задачу по leetcode.com Удаление дубликатов из отсортированного массива
Учитывая целочисленный массив (например, [1,2,3,3,4,4,5]), и вывод должен быть похож на [1,2,3,4,5,,], вместо дубликатов я должен заполнить массив _
Мой вопрос в том, как заполнить массив подчеркиванием’_’? Ниже приведен мой код.
public static int removeDuplicates(int[] nums){
int l = nums.length;
if(l==0){return 0;}
int k =l;
for(int i = 0;i<l;i ){
if(nums[i]!='_'){
for(int j =i 1;j<l;j ){
if(nums[i]==nums[j])
{ nums[j]='_';
k=k-1;
}
}
}
}
Arrays.sort(nums);
return k;
}
ввод ->>> {-100,1,1,1,2,2,3,2,4,4}
вывод ->>> 5, цифры[-100, 1, 2, 3, 4, 95, 95, 95, 95, 95] >> _
Комментарии:
1. 95 — это значение
_
. У вас есть массив целых чисел, а не символов. Очевидно,int
что это не такchar
2. Страница задачи находится за входом в систему, но вы можете либо а) вернуть массив строк, а затем поместить в него фактические символы подчеркивания, но тогда возвращаемое значение не будет равно an
int
, либо б) на основе подписи метода, возможно, на самом деле не ожидается, что вы где-либо разместите подчеркивания. В этом случае я бы предложил использоватьInteger.MAX_VALUE
их в качестве заполнителя, так как они всегда сортируются в концеint[]
. И если c)_
действительно ожидается, но подпись правильная, после шага сортировки вы можете заполнить ими конец массива (for(int i=k 1;i<l;i )nums[i]='_';
)
Ответ №1:
95-это ascii-код подчеркивания.
Тем не менее, вы не можете ожидать, что символ в целочисленном массиве. Это приводит к двум возможным решениям:
- Может быть, 95 достаточно, потому что это подчеркивание. Но я так не думаю.
- Вы переключаетесь на массив строк, в котором символ подчеркивания может быть представлен. Не знаю, разрешено ли это в вашем примере.
Тем не менее, если вы наткнетесь на цифру 95, у вас возникнет проблема, потому что трудно понять, является ли это подчеркиванием или цифрой.
Ответ №2:
В java вы не можете добавлять '_'
в массив int. Он будет интерпретирован как символ '_'
и преобразован в int. Фактически преобразование '_'
в int дает вам 95, то есть код ascii '_'
.
Будет лучше использовать специальное значение вместо '_'
специального числа для размещения в конце вашего массива, попробуйте использовать Integer.MIN_VALUE
Ответ №3:
Ваша проблема в том, что вы пытаетесь присвоить значение '_'
(которое равно 95 базовым 10 в ascii) an int
. Вы могли бы превратить свой массив в строковый массив, выполнить синтаксический анализ и проверки, но это будет ОЧЕНЬ МЕДЛЕННО. Вы могли бы попробовать это вместо этого:
import java.util.*;
class Solution {
public static void main(String[] args) {
int[] ints = ...; //Read the numbers however you like...
HashSet<Integer> hints = new HashSet<>(); //In a hashset, you may only add any number once
System.out.print('{'); //Print '{'
hints.add(ints[0]); //Add the first number to the hashset...
System.out.print(ints[0]);
for(int ind=1;ind<ints.length;ind ) {
System.out.print(',');
System.out.println(hints.add(ints[ind]) ? ints[ind] : '_'); //Prints the number, if it is the first time you encountered it, '_' otherwise.
}
System.out.println('}');
}
}
Ответ №4:
Спасибо всем вам за ваши подсказки! Задание включает в себя следующие ограничения:
- 0длина
- -100 <= nums [i]
- числа сортируются в неубывающем порядке.
Поэтому я поставил 101 вместо _
/**
- Учитывая целочисленный массив чисел, отсортированных в неубывающем порядке, удалите дубликаты на месте, чтобы каждый уникальный элемент появлялся только один раз.
- Относительный порядок элементов должен быть сохранен прежним */
импорт java.util.Массивы;
общедоступный класс RemoveDuplicatesFromArray3 { общедоступный статический пустой основной(строка[] args) {
int[] nums = {-100, 1, 1, 1, 2, 2, 3, 2, 4, 4,90};
int k = removeDuplicates(nums);
int[] expectedNums = new int[k];
for(int j=0;j<k;j ){
expectedNums[j]=nums[j];
}
assert k == expectedNums.length;
for (int i = 0; i < k; i ) {
assert nums[i] == expectedNums[i];
}
System.out.println(k "," " nums" Arrays.toString(expectedNums));
}
public static int removeDuplicates ( int[] nums){
int l = nums.length;
if (l == 0) {
return 0;
}
int k = l;
for (int i = 0; i < l; i ) {
if (nums[i] != 101) {
for (int j = i 1; j < l; j ) {
if (nums[i] == nums[j]) {
nums[j] = 101;
k = k - 1;
}
}
}
}
Arrays.sort(nums);
return k;
}
}
//=>>> вывод 6, цифры[-100, 1, 2, 3, 4, 90]
// 🙂 спасибо!