123
返回列表 发新帖
楼主: oneselfZhu
跳转到指定楼层
上一主题 下一主题
收起左侧

Google暑期实习电面

🔗
singku 2016-1-5 12:13:42 | 只看该作者
全局:
bobzhang2004 发表于 2015-12-7 08:41
写了下第一题,不太确定是不是正解,欢迎指教

题目里首先说了不能重复 其次说了 如果中间键已被使用 则可以连接之前不能连接的键,楼主这点没考虑进去?
回复

使用道具 举报

🔗
singku 2016-1-7 05:27:43 | 只看该作者
全局:
第一题
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string>
  4. #include <iostream>

  5. #define N   (3)

  6. using namespace std;

  7. int visited[N*N] = {0};

  8. bool can_visit(int i, int j) {

  9.     if (i == j) {
  10.         return false;
  11.     } else if (visited[j-1]) {
  12.         return false;
  13.     }

  14.     //start point
  15.     if (i == 0) {
  16.         return true;
  17.     }

  18.     int rowi = (i-1) / N + 1;
  19.     int coli = (i-1) % N + 1;
  20.     int rowj = (j-1) / N + 1;
  21.     int colj = (j-1) % N + 1;

  22.     if (rowi == rowj) {
  23.         int diff = coli - colj;
  24.         if (diff == 1 || diff == -1) {
  25.             return true;
  26.         } else {
  27.             int k;
  28.             int min = coli > colj ?colj :coli;
  29.             int max = coli > colj ?coli :colj;
  30.             for (k = min+1; k < max; k++) {
  31.                 if (!visited[(rowi-1) * N + k - 1]) {
  32.                     return false;
  33.                 }
  34.             }
  35.             return true;
  36.         }
  37.     } else if (coli == colj) {
  38.         int diff = rowi - rowj;
  39.         if (diff == 1 || diff == -1) {
  40.             return true;
  41.         } else {
  42.             int k;
  43.             int min = rowi > rowj ?rowj :rowi;
  44.             int max = rowi > rowj ?rowi :rowj;
  45.             for (k = min+1; k < max; k++) {
  46.                 if (!visited[(k-1) * N + coli - 1]) {
  47.                     return false;
  48.                 }
  49.             }
  50.             return true;
  51.         }
  52.     } else {
  53.         int diffcol = coli - colj;
  54.         int diffrow = rowi - rowj;
  55.         if (diffcol == diffrow || diffcol == -diffrow) {//diagnal line
  56.             if (diffcol == 1 || diffcol == -1) {//ajacent
  57.                 return true;
  58.             }
  59.             int minrow = rowi > rowj ?rowj :rowi;
  60.             int maxrow;
  61.             int startcol;
  62.             int r;
  63.             if (rowi == minrow) {
  64.                 startcol = coli;
  65.                 maxrow = rowj;
  66.                 if (coli < colj) {
  67.                     r = 1;
  68.                 } else {
  69.                     r = -1;
  70.                 }
  71.             } else {
  72.                 startcol = colj;
  73.                 maxrow = rowi;
  74.                 if (coli < colj) {
  75.                     r = -1;
  76.                 } else {
  77.                     r = 1;
  78.                 }
  79.             }
  80.             int k;
  81.             for (k = minrow+1; k < maxrow; k++) {
  82.                 if (!visited[(k-1)*N + startcol + r * (k-minrow)]) {
  83.                     return false;
  84.                 }
  85.             }
  86.             return true;
  87.         } else {
  88.             return true;
  89.         }
  90.     }
  91. }

  92. string int_to_string(int i) {
  93.     char buf[1024];
  94.     snprintf(buf, sizeof(buf), "%d", i);
  95.     return string(buf);
  96. }

  97. void back_track_visit(int len, int cur_len, int cur_pos, string path, int &total)
  98. {
  99.     if (cur_len == len) {
  100.         total++;
  101.         //cout << path << endl;
  102.         return;
  103.     }

  104.     for (int i = 1; i <= N*N; i++) {
  105.         if (!can_visit(cur_pos, i)) {
  106.             continue;
  107.         }

  108.         visited[i-1] = 1;
  109.         back_track_visit(len, cur_len+1, i, path + ">" + int_to_string(i), total);
  110.         visited[i-1] = 0;
  111.     }
  112. }

  113. int main(void)
  114. {
  115.     int total = 0;
  116.     back_track_visit(9, 0, 0, "", total);
  117.     cout << total << endl;
  118. }
复制代码
回复

使用道具 举报

🔗
bobzhang2004 2016-2-6 00:26:27 | 只看该作者
全局:
请问楼主第二轮第一题“给定一个函数 boolean isWord(string s),可以判断这个字符串是否是一个合法的英语词汇
然后给一个初始的字符串s,只能对它做删除字母的操作,求问最长的合法的英语词汇”是怎么做的? brute force吗?
回复

使用道具 举报

🔗
bobzhang2004 2016-2-6 00:31:12 | 只看该作者
全局:
singku 发表于 2016-1-5 12:13
题目里首先说了不能重复 其次说了 如果中间键已被使用 则可以连接之前不能连接的键,楼主这点没考虑进去 ...

对啊,如果这样的话,确实还得有个更新map的操作啊
回复

使用道具 举报

🔗
DreamBoy 2016-2-8 02:06:30 | 只看该作者
全局:
echo33 发表于 2015-12-13 03:14
第一题是分成[1,3,7,9], [2,4,6,8],[5]三种键吗

ls的好像不太对,即使你加上visited

你想出来怎么用backtracking做了吗
回复

使用道具 举报

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

本版积分规则

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