📣 Back to School开学季 - VIP通行证5折优惠!蓝莓、Offer多多同步优惠
12
返回列表 发新帖
楼主: ekco
跳转到指定楼层
上一主题 下一主题
收起左侧

uber电面面经

🔗
 楼主| ekco 2015-1-28 23:18:47 | 只看该作者
全局:
您好!
本帖隐藏的内容需要积分高于 100 才可浏览
您当前积分为 0。
使用VIP即刻解锁阅读权限或查看其他获取积分的方式
游客,您好!
本帖隐藏的内容需要积分高于 100 才可浏览
您当前积分为 0。
VIP即刻解锁阅读权限查看其他获取积分的方式
Unlock interview details and practice with AI
Curated Interview Questions from Top Companies
回复

使用道具 举报

🔗
houqingniao 2015-3-3 02:05:56 | 只看该作者
全局:
第一题Follow up: 给出所有能够组成的palindrome
能想到两头插的做法。感觉还挺烦啊 LZ咋做的? 能上代码不?
回复

使用道具 举报

🔗
kaimiku 2015-3-3 06:38:50 | 只看该作者
全局:
  1. #include <bits/stdc++.h>
  2. using namespace std;

  3. /**
  4. * If a given string can be permutated to form a palindrome string
  5. * I - string
  6. * O - bool, true/false
  7. */
  8. int is_palindrome(string &str) {
  9.   unordered_map<char, int> table;
  10.   for (char c : str)
  11.     table[c]++;
  12.   int o=0, e=0;
  13.   for (auto p : table) {
  14.     if (p.second&1) o++;
  15.     else            e++;
  16.   }
  17.   return o<2;
  18. }

  19. /**
  20. * Extract all even chars
  21. * I - string
  22. * O - chars of first half of the potential palindrome string
  23. */
  24. vector<char> half_string(string &str, char &mid) {
  25.   unordered_map<char, int> table;
  26.   for (char c : str)
  27.     table[c]++;
  28.   vector<char> ret;
  29.   for (auto p : table) {
  30.     if (!(p.second&1))
  31.       for (int i=0; i<p.second/2; i++)
  32.         ret.push_back(p.first);
  33.     else
  34.       mid=p.first;
  35.   }
  36.   return ret;
  37. }

  38. /**
  39. * Generate all possible palindrome strings.
  40. * I - string
  41. */
  42. void generate_palindrome(int c, int n, vector<char> &a, string &p, int v[], char &mid) {
  43.   if (c==n) {
  44.     string pr=p;
  45.     reverse(pr.begin(), pr.end());
  46.     if (mid)
  47.       pr=mid+pr;
  48.     pr=p+pr;
  49.     cout<<pr<<endl;
  50.   } else {
  51.     for (int i=0; i<n; i++) if (!v[a[i]]) {
  52.       v[a[i]]=1;
  53.       p[c]=a[i];
  54.       generate_palindrome(c+1, n, a, p, v, mid);
  55.       v[a[i]]=0;
  56.       while (i<n-1 && a[i+1]==a[i]) i++;
  57.     }
  58.   }
  59. }

  60. int main(void) {
  61.   string str;
  62.   cin>>str;
  63.   if (is_palindrome(str)) {
  64.     char mid=0;
  65.     auto half=half_string(str, mid);
  66.     sort(half.begin(), half.end());
  67.     int n=half.size();
  68.     int v[256];
  69.     memset(v, 0, sizeof v);
  70.     string palindrome(n, ' ');
  71.     generate_palindrome(0, n, half, palindrome, v, mid);
  72.   }
  73. }
复制代码
回复

使用道具 举报

🔗
 楼主| ekco 2015-3-3 11:18:34 | 只看该作者
全局:
houqingniao 发表于 2015-3-2 13:05
第一题Follow up: 给出所有能够组成的palindrome
能想到两头插的做法。感觉还挺烦啊 LZ咋做的? 能上代码不 ...

选出一半数量的字符进行permutation就好了,permutation详见11楼
回复

使用道具 举报

🔗
houqingniao 2015-3-4 01:45:36 | 只看该作者
全局:
哦 没仔细看~~~
懂了 哈哈
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表