先言:
这是一题接触杭电半年多写的第一次用JAVA编译的题目,且很荣幸的耗时3小时解决所有杂七杂八的问题成功AC的题目。有一些过程中遇到的小问题下列将一一解释:
代码演示:
package test_2006;
import java.util.Scanner;
/*
* 需求:给n个整数,求其中的奇数积
* 分析:
* 键盘录入数据(!!!测试多组数据)
* 对给定的数据遍历,将其中的奇数累积
* 定义一个变量oddMul
* 最后将oddMul打印输出
*/
public class OddMultipliction {
public static void main(String[] args) {
//键盘录入数据
Scanner sc = new Scanner(System.in);
while(sc.hasNextInt()){
//分配堆内存空间
int[] arr = new int[sc.nextInt()];
//输入多组数据
for(int i = 0; i < arr.length; i++) {
arr[i] = sc.nextInt();
}
//定义并初始化变量oddMul
int oddMul = 1;
//遍历数组的各个元素
for(int i = 0; i < arr.length; i++) {
//对遍历到的元素进行奇数判断
if(arr[i]%2 == 1 || arr[i]%2 == -1) {
oddMul *= arr[i];
}
}
//打印结果
System.out.println(oddMul);
}
}
}
思路:
看题目得知需求只是要从测试的数据中调出奇数来做乘积。所以,我想到的是将数据录入存放在一个数组里,对其遍历。将其中满足条件的元素与一个存放数据的变量(初始化为1)做乘法运算。
现在来说说遇到的问题呗:
a.主类问题:提交代码HDOJ对各类语言的输入输出格式有特定要求。这边特别是JAVA(说明源于F.A.Q):
|
import java.util.Scanner;
class Sum{ //另一种格式:public class Main
public static void main(String[] args){
Scanner sc = new int(System.in);
int a,b;
//录入多组数据
while(sc.hasNextInt()){
a = sc.nextInt();
b = sc.nextInt();
System.out.println(a + b);
}
}
}
b.判断奇数:实数范围内的整数中对二求余的绝对值为一的数
if(arr[i]%2 == 1 || arr[i]%2 == -1) {
代码块(^@^)
}
———————————————————————————分割线——————————————————————————————
另一种思想:
将录入的数据直接判断是不是奇数。如果是的话,就对他进行乘法运算;如果不是的话,就跳过判断下一个数据。
代码演示:
package test_2006;
/*
* 采用录入数据直接对奇数求和
*/
import java.util.Scanner;
public class OddMul_02 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNextInt()) {
int n = sc.nextInt();
//定义变量oddMul
int oddMul = 1;
//遍历数组的各个元素
int value;
for(int i = 0; i < n; i++) {
//录入数据
value = sc.nextInt();
//对测试数据做判断
if(value%2 == 1 || value%2 ==-1) {
oddMul *= value;
}
}
System.out.println(oddMul);
}
}
}
这个Demo较之前一个,解决该问题更优。
第一个Demo为了存入数据,从而创建一个数组的堆内存空间存数据,所以空间复杂度为O(n)。先前存数据再到之后的条件判断,两个for循环。即时间复杂度为O(2n)。
第二个Demo只有初始化一个变量value的空间l来存放数组,空间复杂度为O(1)。再对录入到value上的直接判断是否满足条件,所以其时间复杂度为O(n)。
综上,Demo_02优于Demo_01。