文章目录
- 相关题目
- 667.优美的排列II
- 481.神奇字符串
构造题会让我们按照一定的规律去构造一个符合条件的结果,其通常是和其他算法结合起来考察的,其中的规律有时候是比较难找的,因此只能对其进行规律总结。
相关题目
667.优美的排列II
参考宫水三叶的题解,从首位开始按照「升序」间隔排列,次位开始按照「降序」间隔排列(即排列为 [1, n, 2, n - 1, 3, ...]
)时,相邻差值会从 n - 1
开始递减至 1
,共 n - 1
种,是这题的trick。这样的k+1
个数字可以构造k
个差值(与第一个数字是什么无关,比如4、5、6、7、8、9构造成4->9->5->8->6->7),然后只需要让剩余的数字在前面按照升序排列就行。
class Solution {public int[] constructArray(int n, int k) {int t=n-k-1;int[]ans=new int[n];for(int i=0;i<t;i++){ans[i]=i+1;}for(int i=t,a=n-k,b=n;i<n;){ans[i++]=a++;if(i<n) ans[i++]=b--;}return ans;}
}
481.神奇字符串
本题的意思是统计一个由1,2组成的字符串中,前n个字符里1的个数。该字符串中1,2轮换出现,并且「一组1」或者「一组2」出现的次数是由其从前往后的数字本身决定的,参考灵神的题解,其中1和2转换采用了s[-1]^3
的方法。
class Solution:def magicalString(self, n: int) -> int:s=[1,2,2]i=2while len(s)<n:s += [s[-1]^3]*s[i]i += 1return s[:n].count(1)