等差数列复盘  思路 设置k,i,j三个位置指针,k指向当前待判定序列的最左端点,i指向当前序列第一个不为-1的位置,j 指向当前序列第二个不为-1的位置。 求公差 d = (nums[j] - nums[i]) / (j - i); ,1. 若公差不为整数,说明 i 到 j 间不能构成等差序列 (例如1 -1  2 公差d为0.5,不符合题意)  2. 若 nums[j] - d*(j - k) <= 0) 说明最左面端点k值<=0 不符合题意。 则1.2两种情况均计数+1,指针k向右移动到 j 位置循环判断。 若可以构成等差序列,则指针k移动到 j+1位置向右寻找可以构成等差序列的最右端点。 c++: #include<iostream> #include<vector> using namespace std; int main() { int n; while (cin >> n) { vector<double> nums(n); for (int i = 0; i < n; i++) cin >> nums[i]; int cnt = 0, i, j, k = 0; while (k < n) { cnt++; i = k; while (i < n && nums[i] == -1) i++;  j = i + 1; while (j < n && nums[j] == -1) j++; if (j >= n) break; double d = (nums[j] - nums[i]) / (j - i); if (d - floor(d) || nums[j] - d*(j - k) <= 0) { k = j; continue;  } k = j + 1; while (k < n && nums[j] + d*(k - j) > 0 && (nums[k] == -1 || nums[k] == nums[j] + d*(k - j)))  k++; } cout << cnt << endl; } return 0; }