乐港2017校招笔试题

前言ios

今天通知过了笔试,但以为笔试没来得及作的题仍是要作一下。c++

题目git

 第二道题,字符串的,大意就是,给你个形如a,b,c,ab,bb,cb,ac,bc,cc,aab,bab,cab,abb,bbb,cbb,acb,bcb,ccb......按某种规律排列的无限长的字符串数组,要求:数组

1)给定一个位置,输出对应的字符串。spa

2)给定一个字符串,找出它在这个数组里的位置。code

思路blog

 仔细观察会发现其实就是用a,b,c在每个字符串上不断循环头插获得新的字符串,好比a,b,c循环在b,c字符上头插获得,ab,bb,cb,ac,bc,cc,而后又在,ab,bb,cb,ac,bc,cc字符串的头部插入获得,aab,bab,cab,abb,bbb,cbb,acb,bcb,ccb......ccc。也就是说N位长度的一系列字符串是在N-1位长度的字符串上头插a,b,c获得的。那么能够用一个动态增加的数组来模拟这种状况,c++的vector是个不错的选择。ci

 

另外还要知道的是:N位长的字符串集合的最后一个字符串在该数组中的位置是3 ^ N,好比1位长的最后一个字符是“c”,位置在3^1 = 3。同理2位长度的最后一个字符串"cc"位置为9,同理"ccc"位置为27,以此类推。因此数组无论如何更新,它的长度必定是3^N,且N位长度的字符串的个数为2 * 3^(N - 2)。字符串

那么对于 题目1) 求指定位置的字符串有以下代码:string

#include<iostream>
#include<vector>
#include<math.h>
using namespace std;
const string base = "abc";
int main()
{
    int pos;
    vector<string> res = {"woshishabi","a","b","c"};  //动态增加的字符串数组,从1开始操做更方便
    while(cin >> pos)  //根据输入的位置来更新数组
    {
       int index = pos + 1; //加一,由于题目要求从0开始,可是从1开始便于操做。
       int len = res.size() - 1;
       if(index <= len)  //先判断指定位置的字符串所在的字符串集合是否已经在数组中了。
       {
           cout << res[index] << endl;
           continue;
       }
       //没有的话就把它所在的对应位数的全部字符串放入数组中
       int digit = 1;
       while(pow(3,digit) < index)
       {
           digit++; //循环结束获得须要更新的digit位长的字符串
       }
       int End = pow(3,digit - 1); //digit - 1位字符串的结束位置
       //int dis = num - len;
       int start = 1 + len - 2 * pow(3,res[len].size() - 1); //res中的最多位数的字符串集合的开始位置
       while(start != End) //开始更新字符串数组
       {
           for(int i = 0;i < base.size();i++)
           {
               string temp = res[start];
               temp.insert(0,1,base[i]);
               res.push_back(temp);
           }
           start++;
       }
       cout << res[index] << endl; //输出对应位置的字符串便可
    }
}

 

能够看到初始我是先把a,b,c放入数组中。而后基于输入的位置来肯定须要更新到的最大位数。

 

对于题目2)求指定字符串的位置,

1.能够根据它的长度L肯定它所在集合的最后一个字符串的位置lastpos = pow(3,L)。

2.求这个字符串集合的首位置startpos = lastpos - 2 * 3^(L- 2) + 1。

3.而后在[startpos,lastpos]区间找这个字符串就行,若是lastpos > res的长度,转4.

4.若是lastpos > res的长度就用题目1)的解决方法更新res的内容就行,而后再去查找。

相关文章
相关标签/搜索