我的代码只差5例,我不知道为什么,有人帮助我。
问题
返回一个版本给定的阵列,其中所述阵列中的每个零值由最大奇数值到所述阵列中的零的右侧取代的。 如果没有奇数值零的右侧,留下零是零。
zeroMax({0,5,0,3})→{5,5,3,3}
zeroMax({0,4,0,3})→{3,4,3,3}
zeroMax({0,1,0})→{1,1,0}
我的代码
public int[] zeroMax(int[] nums) {
int acum = 0;
int i = 0;
for( i = 0; i < nums.length;i++){
if(nums[i]==0){
for(int j = i; j < nums.length;j++){
if (nums[j]%2!=0){
acum = nums[j];
break;
}
}
nums[i]=acum;
}
}
return nums;
}
你所缺少的是,这有可能是你的零右侧的一个以上的奇数,你需要选择最大的一个。
编辑:而且你还需要重置“acum”。 我更新了我的建议:)
这里有一个建议:
public int[] zeroMax(int[] nums) {
int acum = 0;
int i = 0;
for (i = 0; i < nums.length; i++) {
if (nums[i] == 0) {
for (int j = i; j < nums.length; j++) {
if (nums[j] % 2 != 0 && nums[j] > acum) {
acum = nums[j];
}
}
nums[i] = acum;
acum = 0;
}
}
return nums;
}
这可以通过重新排列的问题有点多更有效地完成。
相反,遍历左到右,然后在为更换右扫描整数,你可以,而不是仅仅去从右到左。 然后,直到你遇到一个大奇数,你可以存储先前替换。
public int[] zeroMax(final int[] nums) {
int replace = 0; // Stores previous largest odd - default to 0 to avoid replacement
for (int i = nums.length - 1; i >= 0; i--) { // start from end
final int next = nums[i];
if (next == 0) { // If we should replace
nums[i] = replace;
} else if (next % 2 == 1 && next > replace) {
// If we have an odd number that is larger than the replacement
replace = next;
}
}
return nums;
}
鉴于你的例子,这样的输出:
[5, 5, 3, 3]
[3, 4, 3, 3]
[1, 1, 0]
public int[] zeroMax(int[] nums) {
for (int i=0; i<nums.length; i++)
{
if (nums[i] == 0)
{
int maxindex = i;
for (int j=i+1; j<nums.length; j++)
{
if ((nums[j]%2 == 1) && (nums[j] > nums[maxindex]))
{
maxindex = j;
}
}
nums[i] = nums[maxindex];
}
}
return nums;
}
这alows你找到的最大奇数向右的指数,即指数与数字代替零
最根本的问题是,这种算法并不搜索最大的奇数值,但对于数组中的第奇数值,即给定值的权利。 除此之外,你可能会考虑为所有指标简化代码的最大单值创建表。
public int[] zeroMax(int[] nums) {
for (int i = 0; i < nums.length - 1; i++) {
if (nums[i] == 0) {
int max = 0;
for (int j = i + 1; j < nums.length; j++) {
if (nums[j] % 2 != 0 && nums[j] > max) {
max = nums[j];
}
}
nums[i] = max;
max = 0;
}
}
return nums;
}
public int[] zeroMax(int[] nums) {
int val = 0;
for(int i = 0; i < nums.length; i++) {
if(nums[i] == 0) {
for(int j = i + 1; j < nums.length; j++) {
if(val <= nums[j]) {
if(nums[j] % 2 == 1) {
val = nums[j];
}
}
}
nums[i] = val;
val = 0;
}
}
return nums;
}
public int[] zeroMax(int[] nums) {
int[] result = nums.clone();
for (int i = nums.length - 1, max = 0; i >= 0; i--)
if (isOdd(nums[i])) max = Math.max(nums[i], max);
else if (nums[i] == 0) result[i] = max;
return result;
}
boolean isOdd(int num) { return (num & 1) == 1; }
我们向后遍历,总是存储最大遇到奇数(或0
,如果没有被发现)中max
。
当我们找到一个0
,我们简单地覆盖它max
。
输入是不变,以避免破坏别人的输入。
这里是一个适用于每个输入的代码。 试试这个在您的IDE
public int[] m1(int a[]){
int j = 0;
for (int i = 0; i < a.length; i++) {
if(a[i]!=0){
continue;
}
else if(a[i]==0){
j=i;
while(j<a.length){
if(a[j] % 2 != 0){
if(a[i]<=a[j]){
a[i] = a[j];
j++;
}
else{
j++;
continue;
}
}
else{
j++;
continue;
}
}
}
}
return a;
}