字节跳动 2019 春季算法实习生在线笔试

1. 题目一

求最少收到多少硬币,即优先用大面额的硬币找零,类似于求一个数的个位十位百位。

#include <iostream>
#include <stdio.h>

using namespace std;

int main()
{
    int n;
    scanf("%d", &n);

    int change = 1024 - n;
    int a = change / 64;
    int b = (change - a * 64) / 16;
    int c = (change - a * 64 - b * 16) / 4;
    int d = (change - a * 64 - b * 16 - c * 4) / 1;

    cout << a+b+c+d;
    return 0;
}

2. 题目二

先处理有连续三个字母的情况。遍历字符串,定义一个 cnt 变量,如果字符与前一个字符相同,则 cnt 增 1;若不同,cnt 置 1,继续向后遍历。若 cnt 增到 3,则当前字母应该被去除,cnt 减 1。

再处理 AABB 的情况,思路同上。遍历字符串,定义一个 cnt 变量,如果字符与前一个字符相同,则 cnt 增 1;若不同,cnt 置 1,继续向后遍历。若 cnt 增到 2,则直接查看其后的两个字符是否相同,若相同,去除第二个 B。

由于我们是从左向右遍历,所以第三种情况完全不用额外再处理。

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <vector>

using namespace std;
void Three_Consecutive(string &s);
void Remove_AABB(string &s);
int main()
{
    int n;
    scanf("%d", &n);

    vector<string> data(n);

    for (int i = 0; i < n; i++)
    {
        cin >> data[i];
    }

    for (int i = 0; i < n; i++)
    {
        Three_Consecutive(data[i]);
        Remove_AABB(data[i]);
        cout << data[i] << endl;
    }

    return 0;
}

void Remove_AABB(string &s)
{
    int n = s.size();
    string temp;
    int same = s[0];
    int cnt = 1;
    temp.push_back(s[0]);
    for (int i = 1; i < n; i++)
    {
        int AABB_flag = 0;
        if (s[i] == same)
        {
            cnt++;
            if (cnt == 2) // 遇到两个连续的字符 AA,查看其后是否有 BB
            {
                if (i + 2 < n && s[i+1] == s[i+2])
                {
                    AABB_flag = 1;
                    cnt = 1;
                    same = s[i+1];
                }
            }
        }
        else
        {
            cnt = 1;
            same = s[i];
        }
        temp.push_back(s[i]);
        if (AABB_flag)
        {
            temp.push_back(s[i+1]);
            i = i + 2; // 跳过 BB 两个字符
        }
    }
    s = temp;
}

void Three_Consecutive(string &s)
{
    int n = s.size();
    string temp;
    int same = s[0];
    int cnt = 1;
    temp.push_back(s[0]);
    for (int i = 1; i < n; i++)
    {
        int flag = 0;
        if (s[i] == same)
        {
            cnt++;
            if (cnt == 3)
            {
                cnt--;
                flag = 1;
            }
        }
        else
        {
            cnt = 1;
            same = s[i];
        }
        if (!flag)  temp.push_back(s[i]);
    }
    s = temp;
}

3. 题目三

此题与 LeetCode 135——分发糖果 类似,只不过所有的人排成了一圈。因此,我们只需要先找到得分最小的人,然后以此为起始点分别向左向右遍历求得左右序奖赏即可。

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <vector>

using namespace std;

int Cal_Reward(vector<int> &data)
{
    int min_value = data[0];
    int min_index = 0;
    int n = data.size();
    for (int i = 1; i < n; i++)
    {
        if (data[i] < min_value)
        {
            min_value = data[i];
            min_index = i;
        }
    }

    vector<int> left_reward(n, 1);
    for (int i = min_index + 1; i != min_index; i++)
    {
        int left = i - 1;
        int right = i;

        if (i == n)
        {
            right = 0;
            i = 0;
            left = n - 1;
        }

        if (data[right] > data[left])    left_reward[right] = left_reward[left] + 1;
        if (min_index == i)   break; // 最小值为 data[0]
    }

    vector<int> right_reward(n, 1);
    for (int i = min_index - 1; i != min_index; i--)
    {
        int left = i;
        int right = i + 1;

        if (i == -1)
        {
            right = 0;
            i = n - 1;
            left = i;
        }

        if (data[left] > data[right])    right_reward[left] = right_reward[right] + 1;
        if (min_index == i)   break; // 最小值为 data[n-1]
    }

    int result = 0;
    for (int i = 0; i < n; i++)
    {
        result += max(right_reward[i], left_reward[i]);
    }
    return result;
}

int main()
{
    int n;
    scanf("%d", &n);

    for (int i = 0; i < n; i++)
    {
        int num;
        scanf("%d", &num);
        vector<int> data(num, 0);
        for (int j = 0; j < num; j++)
        {
            cin >> data[j];
        }

        cout << Cal_Reward(data) << endl;
    }

    return 0;
}

4. 题目四

此题与 今日头条 2018 AI Camp 5 月 26 日在线笔试编程题第二道——最小分割分数 相似。绳子的长度最短为 0,最长为 N 根绳子的最大值。因此采用二分搜索,如果某个长度的值可以裁剪出 M 根绳子,继续往右搜索,否则向左搜索,直到区间小于 1e-3 结束。

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <vector>

using namespace std;

int main()
{
    int n = 0, m = 0;
    scanf("%d %d", &n, &m);

    vector<int> data(n, 0);
    int max_length = 0;
    for (int i = 0; i < n; i++)
    {
        cin >> data[i];
        max_length = max_length > data[i] ? max_length : data[i];
    }

    float left = 0;
    float right = max_length;

    float result;
    while (fabs(right - left) >= 1e-3)
    {
        float mid = left + (right - left) / 2;

        int num = 0;
        for (int i = 0; i < n; i++)
        {
            num += int(data[i] / mid);
        }

        if (num >= m)
        {
            left = mid;
            result = mid;
        }
        else
        {
            right = mid;
        }
    }

    printf("%.2f", result);

    return 0;
}

获取更多精彩,请关注「seniusen」!

原文地址:https://www.cnblogs.com/seniusen/p/10585483.html

时间: 2024-12-29 11:26:40

字节跳动 2019 春季算法实习生在线笔试的相关文章

拼多多 2019 春季算法实习生在线笔试

1. 题目一 给出两个数组,求两个数组对应元素乘积的最小值. 先对两个数组排序,然后用第一个数组的最大值和第二个数组的最小值相乘,依次遍历即可. ?#include <iostream> #include <stdio.h> #include <vector> #include <algorithm> using namespace std; bool ascend(int i, int j) {return (i < j);} bool descen

2015阿里巴巴前端实习生在线笔试考后总结

写在前面 还是太年轻,第一次在线笔试有些紧张了 一.2015题目 我遇到的题目:6个选择其中3个多选,1个填空,6个大题.客服姐姐说题目是随机给的(因为给了一个时段考试,而不是统一时间点开考),不过题型应该是固定的. 单选:一个数组,两个引用,相互赋值,问输出 眩晕抗性-30% 单选:问一个return匿名函数的函数的执行结果,内部还有apply 眩晕抗性再-69% 单选:问字符串替换结果是什么,当然,又是套了几层,绕了几圈 眩晕抗性再-1%,嗯,做完这道给彻底绕晕了 多选:移动端,如果A按钮上

【求职】字节跳动2019校招机器学习算法工程师面试

面试问题总结. 问题:1. 自我介绍.2. 介绍了一下自己简历上的项目.3. SVM详细原理.4. Kmeans原理,何时停止迭代. 算法题:1. 一个随机整数产生器产生[1,5],如何设计一个产生[1,7]的随机整数产生器.解法:设k1,k2属于[1,5], 生成k3 = 5*(k1-1)+k2+1, 则k3属于[1,25], 将k3分成两个部分,[1,21]和[22,25]. 判断,若属于[1,21], 则令op=k3%7+1,op属于[1,7], 否则丢弃. 2. 给定一个旋转的有序数组,

京东2019暑期实习生在线笔试(原创)

第一题: 题目描述:现有红绿两种颜色的石头,现在我们需要用这两种石头搭建一个塔,塔需要满足如下三个条件:1,第一层应该包含1块石头,第二层应该包含两块,第i块需要包含i块石头:2,同一层的石头应该是同一个颜色(红或绿):3,塔的层数尽可能多.问在满足上述三个条件的前提下,有多少种不同的建造塔的方案,当塔中任意一个对应位置的石头颜色不同,我们就认为这两个方案不相同.石头可以不用完. 输入:输入仅包含两个正整数,分别表示红和绿砖块的数量a,b(0<=a,b<=2*10**5,a+b>=1)输

2016届阿里实习生在线笔试附加题3

#include<iostream> using namespace std; int a[1000]; int waiting = 1; int main(){ int temp = 0; int i = 0; while(cin>>temp){ a[temp] = 1; if(temp == waiting){ cout<<waiting; for(i = waiting + 1;a[i] == 1;i++){ cout<<","&l

实习生在线笔试问题整理

1.下列CSS3新特性在移动端兼容性较好,我们可以在工作中使用的是? A.position:sticky;作用是让一个区块在窗口中保持可见,当区块没有超出浏览器范围时,作用相当于position:relative;当超出l可视窗口时,作用相当于position:fixed;缺点是兼容性不行,谷歌都不支持了. B.字体大小或尺寸单位使用:以前只用px来做字体大小或尺寸单位,现在用em,是一个相对单位,可以随着浏览器可视窗口的改变而改变,所以是正确答案. C.CSS.supports() API;兼

二分查找技巧---字节跳动2018校招算法方向(第二批)---用户喜好

[编程题]用户喜好 时间限制:3秒 空间限制:262144K 为了不断优化推荐效果,今日头条每天要存储和处理海量数据.假设有这样一种场景:我们对用户按照它们的注册时间先后来标号,对于一类文章,每个用户都有不同的喜好值,我们会想知道某一段时间内注册的用户(标号相连的一批用户)中,有多少用户对这类文章喜好值为k.因为一些特殊的原因,不会出现一个查询的用户区间完全覆盖另一个查询的用户区间(不存在L1<=L2<=R2<=R1). 输入描述: 输入: 第1行为n代表用户的个数 第2行为n个整数,第

字节跳动面试总结(2019年8月)

个人简介 本人坐标南京,16年毕业,在某一传统行业从事JavaWeb后端开发,三年工作经验.出于技术焦虑.能力成长陷入瓶颈.对体制内的文化和氛围无法适应等原因,决心换个环境和工作,进入互联网行业,继续自己的技术追求之路.19年8月应聘字节跳动公司的后端研发工程师岗位,现对经历的4轮技术面和1轮HR面做个总结. 面试经历 每轮技术面时长40min-1h不等,可能一次一轮面试,也可能两轮连续进行.每轮先以简单的自我介绍开场,然后面试官根据个人的工作经历和技术能力进行提问,最后预留20min~30mi

阿里在线笔试算法工程师附加题

前几天参加了阿里的在线笔试,报的职位是算法工程师,笔试感觉难度适中,选择题包含数据结构.离散数学.小的智力问题还有一些读程序选结果的题目.其中数据结构和排列组合最多.当时比较慌乱,没做记录.只记下了三个附加题. 第一题很简单.要求实现一个方法,在两个排好序(升序)的整型数组中找到中位数.传入4个参数,分别是两个数组和他们的大小.这个题目既然简单就要写的高效一些.我用的归并排序的思想,将两个数组合并,在合并的过程中找到中位数.并对奇偶分情况讨论,注意偶数情况下有可能出现小数.代码如下: doubl