周赛160:数组变换
题目如下:
首先,给你一个初始数组 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 };
周赛不易,诸君共勉!
大道五十,天衍四九,人遁其一!