因此,我试图比较两个字符数组,而keyW中存在的所有字母都应该从数组invAlphabet中删除。我已经能够在invAlphabet数组中找到重复的元素,但是,我不知道如何在不使用列表或集合的情况下删除重复的元素,而我不应该使用.有什么想法吗?
public static void main(String[] args)
{
final int SIZE = 26;
char[] keyW = {'A', 'L','O'};
char[] invAlphabet = new char [SIZE];
for (int i = 0; i < SIZE; i++)
{
invAlphabet[i] = (char)('Z' - i);
}
for (int i = 0; i<keyW.length; i++)
{
for (int j = 0; j < invAlphabet.length; j++)
{
if(keyW[i] == invAlphabet[j])
{
//need to delete the invAlphabet[j] elements that are duplicates
System.out.println(invAlphabet[j]);
System.out.println(j);
break;
}
}
}
}发布于 2016-11-26 21:48:05
如果您想在O(n)中解决这个问题,那么您可以标记keyW[]数组中的所有字符,然后检查它们,不要将它们添加到新的noDuplicateArray[]中。
char[] keyW = {'A', 'L', 'O', 'P'};
char[] invAlphabet = {'X', 'A', 'P', 'B', 'C'};
//create boolean array
boolean[] mark = new boolean[128];
Arrays.fill(mark, false);
//mark which characters are present in keyW array
for (char ch : keyW) {
mark[ch] = true;
}
// find number of duplicate character in invAlphabet array
int duplicateCount = 0;
for (char ch : invAlphabet) {
if (mark[ch]) {
duplicateCount++;
}
}
// create new array
// size of new array = invAlphabet array length - duplicate number of character in invAlphabet array
char[] noDuplicateArray = new char[invAlphabet.length - duplicateCount];
//add character in new array
int idx = 0;
for (char ch : invAlphabet) {
if (!mark[ch]) {
noDuplicateArray[idx++] = ch;
}
}发布于 2016-11-26 21:21:23
我首先编写一个方法来搜索给定的char[] (即contains方法),例如
private static boolean contains(char[] chars, char ch) {
for (char c : chars) {
if (c == ch) {
return true;
}
}
return false;
}然后将问题分解为两个步骤。首先,计数重复项,然后通过不复制复制来构建输出数组。有点像
int dupes = 0;
for (char ch : invAlphabet) {
if (contains(keyW, ch)) {
dupes++;
}
}
int i = 0;
char[] noDupes = new char[invAlphabet.length - dupes];
for (char ch : invAlphabet) {
if (!contains(keyW, ch)) {
noDupes[i] = ch;
i++;
}
} Alternatively,您可以将keyW数组转换为String。而且,在Java 8+中,您可以构造一个字符的Stream。映射到数组,对String进行筛选,然后收集到另一个String。就像,
String keyWord = new String(keyW);
char[] noDupes = IntStream.range(0, invAlphabet.length)
.mapToObj(x -> invAlphabet[x])
.filter(ch -> (keyWord.indexOf(ch) < 0))
.map(String::valueOf)
.collect(Collectors.joining()).toCharArray();发布于 2016-11-26 21:25:11
不能调整数组对象的大小,因为您可以使用其他数据类型。但是,如果只允许使用数组,则可以使用其他一些非字母字符来代替已删除的字符。例如“0”。因此,在使用或打印时,如果字符为“0”,则可以跳过数组中的字符。
https://stackoverflow.com/questions/40823210
复制相似问题