题目如下:
首先,给你一个初始数组 arr
。然后,每天你都要根据前一天的数组生成一个新的数组。
第 i
天所生成的数组,是由你对第 i-1
天的数组进行如下操作所得的:
- 假如一个元素小于它的左右邻居,那么该元素自增
1
。 - 假如一个元素大于它的左右邻居,那么该元素自减
1
。 - 首、尾元素 永不 改变。
过些时日,你会发现数组将会不再发生变化,请返回最终所得到的数组。
样例如下
其实这就是一道简单的暴力题,一个死循环,一个for循环,三个判断语句,一个跳出死循环条件语句,写完。
由于我们不知道哪一天才是数组变化的时候,所以写了一个死循环。
接着是for,题目中给了数组的更新方式:
1、比相邻的大就减
2、比相邻的小就加
3、头尾节点不变
很明显我们需要从头到尾遍历一遍数组,所以套了一层for
与更新条件相呼应的就是三个判断条件,在for循环内部的
1、if (!i || i == n - 1)
2、if (arr[i] > arr[i - 1] && arr[i] > arr[i + 1])
3、if (arr[i] < arr[i - 1] && arr[i] < arr[i + 1])
在三个if语句里填入相应代码,就可以完成数组更新。哦,对了,还有个else不符合以上情况的数组执行else,而且条件语句 1 必须要放在for循环体的最前边。
当for循环结束时,我们就要判断如何跳出死循环了,记得题目要我们输出什么吗,不变的数组,就是说,temp == arr时,就可以break了,否则的话arr = temp;这样整个代码框架就出来了。下面贴一下c++的代码实现:
1 class Solution {
2 public:
3 vector<int> transformArray(vector<int>& arr) {
4 int len = arr.size();
5 vector<int> temp;
6 temp.resize(len);
7
8 while (1)
9 {
10 for (int i = 0; i < len; i++)
11 {
12 if (0 == i || i == len -1)
13 {
14 temp[i] = arr[i];
15 continue;
16 }
17 if (arr[i] > arr[i-1] && arr[i] > arr[i+1])
18 {
19 temp[i] = arr[i]-1;
20 continue;
21 }
22 if (arr[i] < arr[i-1] && arr[i] < arr[i+1])
23 {
24 temp[i] = arr[i]+1;
25 continue;
26 }
27 temp[i] = arr[i];
28 }
29 if (temp == arr)
30 {
31 break;
32 }
33 arr = temp;
34 }
35
36 return temp;
37 }
38 };
周赛不易,诸君共勉!