题解 | #乘积为正数的最长连续子数组#
乘积为正数的最长连续子数组
https://www.nowcoder.com/practice/0112b9b5a09048d89309f55ea666db91
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
int n = Integer.valueOf(in.nextLine());
int[] nums = new int[n];
for(int i = 0; i < n;i++){
nums[i] = in.nextInt();
}
int[][] dp = new int[n][2];
// 连续正数的数量
dp[0][0] = nums[0] > 0 ? 1:0;
// 连续负数的数量
dp[0][1] = nums[0] < 0 ? 1:0;
for(int i = 1; i < n; i++){
//当此时数值>0时,正数由i-1的正数得出-->dp[i-1][0] == 0,则dp[i][0] = 1否则为dp[i-1][0]+1
// 负数由i-1的负数得出--> dp[i-1][1] == 0,则前面没有负数,这个数又是正数,所以dp[i][1] = 0,否则为dp[i-1][1]+1
if(nums[i] > 0){
dp[i][0] = dp[i-1][0] == 0? 1:dp[i-1][0]+1;
dp[i][1] = dp[i-1][1] == 0? 0:dp[i-1][1]+1;
}else if(nums[i] < 0){ // 同理
dp[i][0] = dp[i-1][1] == 0? 0:dp[i-1][1]+1;
dp[i][1] = dp[i-1][0] == 0? 1:dp[i-1][0]+1;
}else{
// 注意此时都为0
dp[i][0] = 0;
dp[i][1] = 0;
}
}
int res = 0;
for(int i = 0; i < n; i++){
res = res > dp[i][0] ? res : dp[i][0];
}
System.out.println(res);
}
}
查看18道真题和解析