周赛160:数组变换

题目如下:

  

首先,给你一个初始数组 arr。然后,每天你都要根据前一天的数组生成一个新的数组。

第 i 天所生成的数组,是由你对第 i-1 天的数组进行如下操作所得的:

  1. 假如一个元素小于它的左右邻居,那么该元素自增 1
  2. 假如一个元素大于它的左右邻居,那么该元素自减 1
  3. 首、尾元素 永不 改变。

过些时日,你会发现数组将会不再发生变化,请返回最终所得到的数组。

样例如下

其实这就是一道简单的暴力题,一个死循环,一个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 };

  周赛不易,诸君共勉!

猜你喜欢

转载自www.cnblogs.com/daker-code/p/11784994.html
今日推荐