gpt4 book ai didi

java - java将数组值左移

转载 作者:行者123 更新时间:2023-12-01 21:48:32 24 4
gpt4 key购买 nike

这是我关于同一方法的第二篇文章。该方法说明如下:

“将 2 个或更多空格的所有序列减少到 1 个空格 字符数组。如果删除任何空格则相同的数字 空字符 '\u0000' 将填充末尾的元素 数组。”

该方法的参数是一个字符数组。我已经成功地计算了重复空格的数量,但是,我一生都无法弄清楚如何在考虑此类重复空格的同时向下移动值。最后,该方法应该用“\u0000”字符替换重复空格的索引数量。这是我到目前为止所拥有的:

// Calculate duplicate count before changing the array
int duplicateCount = 0;
for(int i = 0; i + 1 < characters.length; i++){
if(characters[i] == ' ' && characters[i + 1] == ' '){
duplicateCount++;
}
}

// Shift the array down however much is needed
for(int j = 0; j + 1 < characters.length; j++){
if(characters[j] == ' ' && characters[j + 1] == ' '){
for(int a = j, b = a + 1; b < characters.length; a++, b++){
characters[a] = characters[b];
}
}
}
for(int replace = characters.length - duplicateCount; replace < characters.length; replace++){
characters[replace] = '\u0000';
}
}

因此,如果输入为:char [] 个字符 = {'a', 't', ' ', '.', ' ', ' ', 'g', ' ', ' ', 'h', ' '};

输出应为:char [] ExpectedResult = {'a', 't', ' ', '.', ' ', 'g', ' ', 'h', ' ','\u0000', '\u0000'};

谢谢大家,这个问题看起来应该很简单,但我却被困住了。如果您能为您的答案提供任何解释,我将非常感激。再次感谢您。

最佳答案

就地完成这件事很容易。只需迭代数组,跟踪您正在检查的索引(以查看它是否是额外的空间)和您要复制到的索引。最后,用您的“\u0000”值填充数组即可完成。

我将其设置为一个简单的状态机,以便轻松跟踪我们是否获得了额外的空间。

public void squeezeMe(char[] characters) {
SqueezeState state = SqueezeState.START;

int p = 0;
for (int i = 0; i < characters.length; i++) {
SqueezeState newState = SqueezeState.START;

// Evaluate input based on current state
switch (state) {
case START:
case NOT_A_SPACE: {
if (Character.isWhitespace(characters[i])) {
newState = SqueezeState.FIRST_SPACE;
} else {
newState = SqueezeState.NOT_A_SPACE;
}
break;
}
case FIRST_SPACE:
case EXTRA_SPACE: {
if (Character.isWhitespace(characters[i])) {
newState = SqueezeState.EXTRA_SPACE;
} else {
newState = SqueezeState.NOT_A_SPACE;
}
}
}

// Transition to new state
switch (newState) {
case NOT_A_SPACE:
case FIRST_SPACE: {
if (i > p) {
characters[p] = characters[i];
}
p++;
break;
}
}

state = newState;
}

for (int i = p; i < characters.length; i++) {
characters[i] = '\u0000';
}

}

private enum SqueezeState {
START, NOT_A_SPACE, FIRST_SPACE, EXTRA_SPACE;
}

@Test
public void test1() {
char[] result = { 'a', 't', ' ', '.', ' ', ' ', 'g', ' ', ' ', 'h', ' ' };
char[] expected = { 'a', 't', ' ', '.', ' ', 'g', ' ', 'h', ' ', '\u0000', '\u0000' };
squeezeMe(result);
assertEquals(expected.length, result.length);
for (int i = 0; i < expected.length; i++) {
assertEquals("Index " + i, expected[i], result[i]);
}
}

如果您不想使用状态机,可以这样做:

public void squeezeMe(char[] characters) {
boolean copyThis = false;
boolean wasLastASpace = false;

int p = 0;
for (int i = 0; i < characters.length; i++) {
if (Character.isWhitespace(characters[i])) {
copyThis = !wasLastASpace;
wasLastASpace = true;
} else {
copyThis = true;
wasLastASpace = false;
}

if (copyThis) {
if (i != p) {
characters[p] = characters[i];
}
p++;
}
}

for (int i = p; i < characters.length; i++) {
characters[i] = '\u0000';
}
}

关于java - java将数组值左移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35583019/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com