2019字节跳动算法题

算法题笔记

前期没有练过算法和优化方面的题,所以笔试的时候,做的特别不好,只有第一道题是最简单的。

1.得到的最少硬币数
货币系统包括1、4、16、64元共计4种硬币,以及面值为1024的纸币。现在使用1024的纸币购买一件价值为N(0<N<=1024)的商品,问最少收到多少硬币。
解:
最笨的办法就是(1024-N)/64得到的余数再除以16得到余数再除以4得到余数相加。

class Solution:
    def minnum(self, N):
        num = 0
        res = 1024-N
        for i in [64, 16, 4, 1]:
            num += res/i
            res = res%i
        return num
f = Solution()
N = 200
a = f.minnum(N)
print a
17

3.最少奖品数
有N个人参加比赛,每个人比赛结束后都会得到一个分数,现在将N个人排成一圈领取奖品,要求:
如果某个人的分数比左右的人稿,那么奖品书一定要比左右人的多。
每个人至少得到一个奖品。
问最少应该准备多少奖品?
解:左右遍历,判断奖品数。需要注意的一点是:**N个人围成一个圈。**所以首尾需要判断。

import numpy as np    
class Solution:
    def minnum(self, data):
        n = len(data)
        m = min(data)
        loc = data.index(m)
        res = 0
        #初始化奖品数,保证每个人都有一个奖品
        num1 = [i for i in range(n)]
        num2 = [i for i in range(n)]
        #向右遍历
        for i in range(loc+1, n):
            if data[i] > data[i-1]:
                num1[i] = num1[i-1]+1
        if data[0] > data[n-1]:
            num1[0] = num1[i]
        for i in range(1, loc):
            if data[i] > data[i-1]:
                num1[i] = num1[i-1]+1
        #向左遍历
        for j in range(loc, 0, -1):
            if data[j-1] > data[j]:
                num2[j-1] = num2[j]+1
        if data[n-1] > data[0]:
            num2[n-1] = num2[0] + 1
        for j in range(n-1, loc, -1):
            if data[j-1] > data[j]:
                num2[j-1] = num2[j]
        print num1
        print num2
        for k in range(n):
            res += max(num1[k], num2[k])
        return int(res)

data = [1, 2]
f = Solution()
res = f.minnum(data)

data = [1, 2, 3, 1]
f = Solution()
res = f.minnum(data)           
print res
         
data = [1, 0, 2]
f = Solution()
res = f.minnum(data)           
print res   

data = [1, 2, 2]
f = Solution()
res = f.minnum(data)           
print res   

相似题目Leetcode的题135——分发糖果
描述:
There are N children standing in a line. Each child is assigned a rating value.
You are giving candies to these children subjected to the following requirements:
Each child must have at least one candy.
Children with a higher rating get more candies than their neighbors.
What is the minimum candies you must give?
解:需要注意的一点是排成一列。所以向左向右判断一遍即可

class Solution(object):
    def candy(self, ratings):
        """
        :type ratings: List[int]
        :rtype: int
        """
        n = len(ratings)
        num1 = [1 for i in range(n)]
        num2 = [1 for i in range(n)]
        res = 0
        for i in range(1,n):
            if ratings[i] > ratings[i-1]:
                num1[i] = num1[i-1]+1
        for j in range(n-1, 0, -1):
            if ratings[j-1] > ratings[j]:
                num2[j-1] = num2[j]+1
        for i in range(n):
            res += max(num1[i], num2[i])
        return res
    
data = [1,2,87,87,87,2,1]
f = Solution()
res = f.candy(data)
print res 
13

4.M根绳子最长长度
有N根绳子,第i根绳子的长度为Li,现在需要M根等长的绳子,可以对N根绳子进行任意裁剪但不能拼接,那么这M根绳子的最长长度是多少。
解:
二分法,逼近求解区间得到最优解

class Solution:
    def maxlength(self, data):
        N = data[0][0]
        M = data[0][1]
        L = data[1] 
        max_length = float(max(L))
        min_length = 0.0
        while(abs(max_length - min_length) >= 1e-3):
            mid = min_length + float(max_length - min_length)/2.0
            num = 0
            for i in range(N):
                num += int(L[i]/mid)
            if num >= M:
                min_length = mid
                res = mid
            else:
                max_length = mid
        return res

data中data[0]表示绳子的个数N和需要绳子个数M
data[1]表示N根绳子的长度;

f = Solution()
a = f.maxlength(data)
data=[[3, 4], [3, 5, 4]]
a = f.maxlength(data)
a
Out[16]: 2.5
data = [[3, 6], [5, 2, 3]]
a = f.maxlength(data)
a
Out[19]: 1.4996337890625
data = [[4, 5], [1, 2, 3, 4]]
a = f.maxlength(data)
a
Out[22]: 1.5
### 字节跳动算法岗面试相关题目与准备 #### 一、常见数据结构与算法问题 在字节跳动算法岗位面试中,候选人通常会被考察对基础数据结构和经典算法的理解程度。以下是可能涉及的一些核心知识点: 1. **数据结构** - 数组的操作及其时间复杂度分析[^1]。 - 链表的反转、查找中间节点等问题[^1]。 - 栈和队列的经典应用场景,例如括号匹配、滑动窗口最大值计算等。 - 哈希表的设计与冲突解决方法。 - 树的基本概念,包括二叉树遍历(前序、中序、后序)、平衡二叉树、红黑树等。 2. **算法** - 排序算法的时间复杂度对比及其实现方式,如快速排序、归并排序等。 - 搜索算法的应用场景,比如广度优先搜索(BFS)和深度优先搜索(DFS)。 - 动态规划的核心思想及其典型例子,例如最长公共子序列(LCS)、背包问题等。 - 图论基础知识,包括最短路径算法(Dijkstra, Floyd-Warshall)和最小生成树算法(Prim, Kruskal)。 #### 二、高级技术专题 除了基本的数据结构和算法外,字节跳动还可能会针对某些具体领域提出更深入的技术问题。以下是一些潜在的方向: 1. **分布式系统与微服务架构** - 微服务划分的原则与实际案例讨论[^2]。 - 如何保障微服务系统的高可用性?涉及到负载均衡策略的选择与配置[^2]。 - 反向代理的作用以及Nginx的具体使用技巧[^2]。 - 对于复杂的业务逻辑如何实施隔离措施以防止雪崩效应发生?限流、降级机制又是怎样工作的呢?。 2. **网络协议理解** - HTTP各版本的区别在哪里?它们各自解决了哪些历史遗留下来的问题?[^3]。 - 浏览器接收到服务器返回的信息之后是如何一步步渲染页面出来的?[^3]。 3. **性能优化与稳定性维护** - Sentinel作为一款流行的开源组件,在流量控制方面有哪些独特之处值得我们去探索学习?[^4]。 - 当面对突发性的大规模访问请求时,应该采取什么样的预案来保护整个线上环境不受影响?。 4. **机器学习与大模型方向** - 大规模预训练模型为什么会在当今AI界占据如此重要的地位?其背后蕴含着怎样的理论支撑与发展前景展望?[^5]。 - 如果让你负责构建一套基于Transformer框架下的推荐引擎解决方案你会怎么做?。 #### 三、备考建议 为了更好地应对即将到来的挑战可以从以下几个维度着手准备: - 系统复习计算机科学基础知识,特别是那些高频考点; - 结合真实项目经验提炼总结出可迁移性强的知识点并向考官清晰表达出来; - 关注行业内最新趋势动态保持敏感度及时调整自己的学习计划; ```python def example_code(): """ 这是一个简单的Python函数示例, 展示了如何编写易于理解和扩展的代码。 """ numbers = [3, 1, 4, 1, 5, 9] sorted_numbers = sorted(numbers) # 使用内置sorted()函数进行升序排列 return sorted_numbers ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值