📣 VIP通行证夏日特惠 限时立减$68
楼主: yanyan2060
跳转到指定楼层
上一主题 下一主题
收起左侧

G家面经,已跪

🔗
glaciersilent 2016-6-14 06:36:26 | 只看该作者
全局:
第一题可以先扫描一遍array,找到所有b的位置。然后循环所有的这些位置,看如果这个位置的b是排序后的数列的第一个b的话要进行多少操作,这一步可以O(1)得到,一个循环下来找到最小的步数。算法应该是O(n)
回复

使用道具 举报

🔗
blackrose 2016-6-14 06:46:59 | 只看该作者
全局:
Dp 解第一题,不知道对不对,测了点cases,没差。
  1. int miniChange(string str) {
  2.   int n = str.size();
  3.   vector<int> front(n, 0);
  4.   for(int i = 1; i < n; ++i) {
  5.     if(str[i] >= str[i-1]) front[i] = front[i-1];
  6.     else {
  7.       front[i] = front[i-1] + 1;
  8.     }
  9.   }

  10.   vector<int> backward(n, 0);
  11.   for(int i = n - 1; i > 0; --i) {
  12.     if(str[i-1] <= str[i]) backward[i-1] = backward[i];
  13.     else {
  14.       backward[i-1] = backward[i] + 1;
  15.     }
  16.   }

  17.   int minChange = str.size();
  18.   for(int i = 0; i < n; ++i) {
  19.     minChange = min(minChange, front[i] + backward[i]);
  20.   }
  21.   return minChange;
  22. }


  23. int main(void) {
  24.   cout << miniChange("aaab") << endl;
  25.   cout << miniChange("baab") << endl;
  26.   cout << miniChange("abab") << endl;
  27.   cout << miniChange("bbba") << endl;
  28.   cout << miniChange("baba") << endl;
  29. }
复制代码
回复

使用道具 举报

🔗
blackrose 2016-6-14 06:48:37 | 只看该作者
全局:
第四题就是 dp
回复

使用道具 举报

🔗
alexanderzjs 2016-6-14 07:23:24 | 只看该作者
全局:
edcent 发表于 2016-6-14 03:05
第一题有点点像sort colors 就是不确定sort colors那种方法是不是最少操作

应该是的,类似于贪心吧,假设两端需要交换的b和a不交换,中间必然有另外一些ab需要去替换两端的值,所以必须要交换,不知道对不对哈
回复

使用道具 举报

🔗
fireworks74 2016-6-14 09:19:07 | 只看该作者
全局:
lz好运气,亚麻也不错
回复

使用道具 举报

🔗
July09 2016-6-14 11:21:48 | 只看该作者
全局:
第一题
int convertSortedString(String s) {
        int length = s.length();
        if (length <= 1)
            return length;
        //I assume we want aaa...bbb, ret can be all a or all b
//        let A[n] ends with a, B[n] ends with b
        //We can improve it without array....
        int [] a = new int [1+length];
        int [] b = new int [1+length];
        for (int i = 1; i <= length; ++i) {
            if (s.charAt(i-1) == 'a') {
                a[i] = a[i-1];
                b[i] = 1 + Math.min(a[i-1], b[i-1]);
            } else {
                a[i] = 1 + a[i-1];
                b[i] = Math.min(a[i-1], b[i-1]);
            }
        }

        return Math.min(a[length], b[length]);
    }
回复

使用道具 举报

🔗
houqingniao 2016-6-14 12:03:01 | 只看该作者
全局:
July09 发表于 2016-6-14 11:21
第一题
int convertSortedString(String s) {
        int length = s.length();

厉害~~
感觉对头
回复

使用道具 举报

🔗
dong882205 2016-6-14 12:51:20 | 只看该作者
全局:
blackrose 发表于 2016-6-14 06:46
Dp 解第一题,不知道对不对,测了点cases,没差。

...正准备贴代码, 一看几乎一样, 肯定是对啦, 从前往后, 从后往前各扫一遍, 看加和
回复

使用道具 举报

🔗
blackrose 2016-6-14 13:06:50 | 只看该作者
全局:
dong882205 发表于 2016-6-14 12:51
...正准备贴代码, 一看几乎一样, 肯定是对啦, 从前往后, 从后往前各扫一遍, 看加和

回复

使用道具 举报

🔗
nevets 2016-6-14 13:12:10 | 只看该作者
全局:
第一题其实就1种情况:把一个字符串转换成若干个a之后若干个b,所以用一个数组B维护从0到i中b的个数,一个数组A维护从i到N-1中a的个数,然后循环一遍取min(B[i] + A[i + 1])

第四题其实只要知道每一个cell所在的横纵segment中有几个人就行,先预处理一遍然后NM求最大。
回复

使用道具 举报

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

本版积分规则

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