分析与解法
遍历一遍数组,求出数组中正数(+),负数(-)和0的个数,从而判断N个数乘积的正负性,依此判断是去掉0,还是最小的负数,还是最大的负数,还是最小的正数来得到目标的N-1个数,使乘积最大。
例如:集合全为负数时,去掉最小负数;全为正数时去掉最小正数;等等还有很多种情况.
主要要考虑集合中0的个数与集合中负数的个数以及全为负数的情况。
C# Codes
namespace ConsoleApp2010
{
class Program
{
static void Main(string[] args)
{
System.Console.WriteLine(FindItem(new int[] { -1, -2, -3, -4}));
System.Console.ReadKey();
}
static int FindItem(int[] array)
{
int length = array.Length;
int negativeNum = 0;
int maxNegative = 0;
int minNegative = 0;
int minPositive = 0;
int zeroNum = 0;
for (int i = 0; i < length; i++)
{
if (array[i] < 0)
{
negativeNum++;
if (maxNegative == 0 || maxNegative < array[i])
{
maxNegative = array[i];
}
if (minNegative == 0 || minNegative > array[i])
{
minNegative = array[i];
}
}
else if (array[i] == 0)
{
zeroNum++;
}
else
{
if (minPositive == 0 || minPositive > array[i])
{
minPositive = array[i];
}
}
}
int result;
if (zeroNum > 1)
{
result = 0;
}
else if (zeroNum == 1)
{
if (negativeNum % 2 == 0)
{
result = 0;
}
else
{
result = maxNegative;
}
}
else
{
if (negativeNum % 2 == 0)
{
if (minPositive != 0)
{
result = minPositive;
}
else
{
result = minNegative;
}
}
else
{
result = maxNegative;
}
}
return result;
}
}
}
分享到:
相关推荐
给定一个长度为 n 的整数数组,你的任务是判断在最多改变 1 个元 素的情况下,该数组能否变成一个非递减数列。非递减数列定义如下:对 于数组中所有的 i (1 <= i < n),满足 array[i] [i + 1]
对于给定的n位正整数a 和正整数k,设计一个算法找出剩下数字组成的新数 最小的删数方案。 «编程任务: 对于给定的正整数a,编程计算删去k个数字后得到的最小数。 Input 由文件input.txt提供输入数据。文件的第1...
试设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大。 编程任务:对于给定的由n 行数字组成的数字三角形,编程计算从三角形的顶至底的路径经过的数字和的最大值。 Input 输入数据...
试设计一个算法,计算出从三角形 的顶至底的一条路径,使该路径经过的数字总和最大。 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 编程任务: 对于给定的由n 行数字组成的数字三角形,编程计算从三角形的顶至底的路径...
编程任务:对于给定的n 个实数x1, x2,...,xn,编程计算它们的最大间隙。 Input 输入数据的第1 行有1 个正整数n。接下来的1 行中有n个实数x1, x2,... , xn。 Output 程序运行结束时,将找到的最大间隙输出。 Sample ...
/*加和*/ //给定一个整数t,以及n个整数,在这n个整数中找到加和为t的所有组合。
给定n个整数a1,a2,…,an组成的序列。 如果对于i≤k ≤j,有ak ≤|aj|,则称aj覆盖序列区间ai,ai+1,…,aj。 相应的覆盖区间长度为j-i+1。 本题要求计算给定序列的最大覆盖区间长度。
给定一个十进制正整数N,程序输出从1到N的所有整数中,“1”出现的个数。C语言程序附带实验报告
给定n 个整数组成的序列,现在要求将序列分割为m 段,每段子序列中的数在原序列中连续排列。如何分割才能使这m段子序列的和的最大值达到最小? 编程任务: 给定n 个整数组成的序列,编程计算该序列的最优m 段分割,...
输入一个整数n,代表接下来输入整数个数,n,接着输入n个整数,整数用int表示即可。 输出描述 输出整数序列的和、最小值、最大值。用空格隔开,占一行 样例输入 2 1 2 样例输出 3 1 2 提交代码 自己编写的基础知识...
给定一个整数n,求出所有连续的且和为n正整数。比如对于整数27,结果为2~7、8~10、13和14,因为这些数之间的整数的和都是27。注意:并不是所有的整数都有结果,例如不存在连续的整数和为16。为了提高计算的效率,...
# 给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合。 # 示例: # 输入: n = 4, k = 2 # 输出: # [ # [2,4], # [3,4], # [2,3], # [1,2], # [1,3], # [1,4], # ]
# 给定长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output , # 其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 # 输入示例 # [1,2,3,4] # 输出示例 # [24,12,8,6] # 解析 # 不允许使用除...
实现算法: 给定两个整数u和v,它们分别有m和n位数字,且m≤n。用通常的乘法求uv的值需要O(mn)时间。我们可以将u和v均看作是有n位数字的大整数。用分治法在O(nlog3)时间内计算uv的值。当m<<n时,此法效率不高...
给定n个正整数,找出它们中出现次数最多的数。如果这样的数有多个,请输出其中最小的一个。 输入格式 输入的第一行只有一个正整数n(1 ≤ n ≤ 1000),表示数字的个数。 输入的第二行有n个整数s1, s2, …, sn ...
实验描述:给定X和Y都是n位整数,计算乘积XY。分治算法思想,将n位X和Y分成2段,每段n/2位。则X分为AB两段,Y分为CD两段。 有X=A*(10)^(n/2)+B,Y=C*(10)^(n/2)+D;XY=(A*(10)^(n/2)+B)(C*(10)^(n/2)+D)=AC*(10)^n+...
第一行为一个整数C,表示有C组测试数据,接下来有2*C行数据,每组测试数据占2行,每组测试数据第一行是1个整数n,表示有n个整数,接下来一行有n个整数,它们之间用空格隔开. Output 你的输出应该有C行,即每组...
对于给定的n个程序存放在磁带上的长度,编程计算磁带上最多可以存储的程序数。 Input 输入由多组测试数据组成。 每组测试数据输入的第一行是2 个正整数,分别表示文件个数n和磁带的长度L。接下来的1 行中,有n个...
给定一个整数数组,其中元素的取值范围为0到10000,求其中出现次数最多的数。
计算数字排列组合,可以组合出任意数字的组合