0 点赞 评论 收藏
分享
0 点赞 评论 收藏
分享
2020-09-10 19:49
The University of New South Wales Java 0 点赞 评论 收藏
分享
牛客638832633号:等差数列复盘
思路
设置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>
(5488)#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;
}
投递顺丰集团等公司10个岗位 >
0 点赞 评论 收藏
分享
投递京东等公司10个岗位 >
0 点赞 评论 收藏
分享
2020-05-16 13:53
The University of New South Wales Java 0 点赞 评论 收藏
分享
2020-05-11 07:43
The University of New South Wales Java 0 点赞 评论 收藏
分享
关注他的用户也关注了: