搜狐_Kolakoski序列

第一道题的大致思路是:Kolakoski序列变换后还是Kolakoski序列本身。那么就需要有两个索引变量,一个是Kolakoski序列索引k_index,一个是变换后的Kolakoski序列所以c_index。因为变换前后都是同一个串,所以可以就在一个Kolakoski序列上进行构造操作。也就是说,当前Kolakoski序列的第i个同数字构成子串的长度将成为变换后的Kolakoski序列中的第i个数字(也就是多对一),换而言之,变换后的Kolakoski序列的数对应变换前的Kolakoski序列的子串长度。
给定的数组a[]={1,2},那么开始构造:(粗略思路如下)
1) 不断循环地依次从a中取数,用索引index代表即为a[index];
2) 如果Kolakoski序列空,则直接添加a[index]进入Kolakoski序列,否则判断当前取的数a[index]和现在构造的Kolakoski序列的最后一个数是否相同值,如果相同,则index++(判断越界,若越界则index=0),否则就将这个值赋给Kolakoski序列,此时操作k_index++。
3) 然后进行Kolakoski[c_index] - 1次循环讲现在的a[index]数添加进去(即Kolakoski[k_index] = a[index]; k_index++),当k_index == n时,输出这个Kolakoski序列。
4) index++并判断是否越界,c_index++。这样不断循环上述步骤,就能求出Kolakoski序列了。
(PS:最后改出隐藏的一个bug时,提交后编译被中断,进入交卷模式,也不知道最后AC没,等放出这道题后在提交一次看看)
#搜狐##Java工程师#
全部评论
#include <iostream> #include <vector> #include <map> using namespace std; int main() {     int n,m;     vector<int> x,y,z;     cin>>n>>m;     int a;     for(int i=0; i<m; i++)     {         cin>>a;         x.push_back(a);     }     for(int i=0; i<x[0]; i++)     {         y.push_back(x[0]);         z.push_back(x[0]);     }     if(x[0]==1)     {   int i;         for(i=0; i<x[1]; i++)         {             y.push_back(x[1]);             z.push_back(x[1]);         }         for(int j=i; j<10000; j++)         {             for(int k=0; k<z[j]; k++)             {                 y.push_back(x[j%m]);                 z.push_back(x[j%m]);                 if(z.size()>n)                     break;             }         }     }     else     {         for(int j=1; j<10000; j++)         {             for(int k=0; k<z[j]; k++)             {                 y.push_back(x[j%m]);                 z.push_back(x[j%m]);                 if(z.size()>n)                     break;             }         }     }         for(int i=0; i<n; i++)             cout<<z[i]<<endl;         return 0;     }
点赞 回复 分享
发布于 2017-08-29 11:40
//生成Kolakoski序列 import java.util.Scanner; public class Kolakoski { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int m = sc.nextInt(); int[] num = new int[m]; for (int i = 0; i < m; i++) { num[i] = sc.nextInt(); } sc.close(); int[] arrSequ = new int[n]; int[] arrLen = new int[n]; arrLen[0] = num[0]; int i = 0, k = 0, s = 0, sumLen = 0; outer: while (true) { for (i = 0; i < arrLen.length; i++) { for (int j = 0; j < arrLen[i]; j++) { arrSequ[s++] = num[k % 4]; if (s >= n) break outer; } sumLen = sumLen + arrLen[i]; ++k; for (int j = sumLen - arrLen[i]; j < sumLen; j++) arrLen[j] = arrSequ[j]; } } for (int j = 0; j < n; j++) { System.out.print(arrSequ[j]+" "); } } }
点赞 回复 分享
发布于 2017-08-28 22:59
public static void getArr(int n, int m, int[] a) {List<Integer> lists = new ArrayList<Integer>(); int flag = 0; int k = 0; int count = 0; while(count < n) { if(k == m) k = 0; lists.add(a[k]); for(int i = 0; i < lists.get(count) - 1; i++) { lists.add(a[k]); } k++; count++; } System.out.println(lists.size()); for (int j = 0; j < n; j++) System.out.println(lists.get(j)); }
点赞 回复 分享
发布于 2017-08-29 09:32

相关推荐

无情咸鱼王的秋招日记之薛定谔的Offer:好拒信,偷了,希望有机会用到
点赞 评论 收藏
分享
11-18 09:44
Java
小白也想要offer:简历别放洋屁,搞不还还放错了,当然你投外企除外,以上纯属个人观点
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务