字节跳动简历冷却期_题库 | 字节跳动校招研发岗位笔试编程题型介绍及解析 第 7 期...

题目1:二阶魔方又叫小魔方,是 2*2*2 的立方体结构,每一面都有 4 个块,共有 24 个块,每次操作可以将一面逆时针或者顺时针旋转90度, 如将上面逆时针旋转90度。 操作如下: 8714b8cab1c25c3b963bcffcb28f3a13.png Zero 在小魔上做了一些改动,用数字替换每个块上面的颜色,称之为数字魔方。魔方上每一面的优美度就是这个面上 4 个数字的乘积,而魔方的总优美度就是 6 个面优美度的总和。 现在 Nero 有一个数字魔方,他想知道这个魔方在操作步超过 5 次的前提下能达到的最大优美度是多少。 魔方展开后每一块的序号如下图: 23075fdebb2406d5498a8b08fde3dad3.png
输入描述: 输入一行包含 24 个数字,按序号顺序给出魔方每一块上面的数字。所有数字的范围为[−100,100][−100,100]。 输出描述: 输出一行包括一个数字,表示最大优美度。 样例输入: 2 −3 −2 3 7 −6 −6 −7 9 −5 −9 −3 −2 1 4 −9 −1 −10 −5 −5 −10 −4 8 22 −3 −2 3 7 −6 −6 −7 9 −5 −9 −3 −2 1 4 −9 −1 −10 −5 −5 −10 −4 8 2 样例输出: 82818281
#include using namespace std;typedef long long LL;const int mp[6][24] = {//  {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23},    {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 21, 20, 10, 11, 12, 13, 18, 16, 19, 17, 15, 14, 22, 23},    {1, 3, 0, 2, 23, 22, 4, 5, 6, 7, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 9, 8},    {0, 21, 2, 23, 4, 5, 6, 1, 9, 15, 10, 11, 12, 3, 8, 14, 16, 7, 18, 13, 20, 17, 22, 19},    {20, 1, 22, 3, 10, 4, 0, 7, 8, 9, 11, 5, 2, 13, 14, 15, 6, 17, 12, 19, 16, 21, 18, 23},    {0, 1, 11, 5, 4, 16, 12, 6, 2, 9, 10, 17, 13, 7, 3, 15, 14, 8, 18, 19, 20, 21, 22, 23},    {10, 4, 2, 3, 18, 5, 6, 7, 8, 0, 19, 11, 12, 13, 14, 1, 16, 17, 15, 9, 21, 23, 20, 22}};const int face[6][4] = {    {0, 1, 2, 3},    {4, 5, 10, 11},    {6, 7, 12, 13},    {8, 9, 14, 15},    {16, 17, 18, 19},    {20, 21, 22, 23}};LL ans;void flip(vector<int> &a, int index){    vector<int> b(a);    for (vector<int>::size_type i = 0; i < a.size(); i++)        b[i] = a[mp[index][i]];    a = b;}LL getSum(vector<int> &arr){    LL ret = 0;    for (int i = 0; i < 6; i++) {        LL s = 1;        for (int j = 0; j < 4; j++)            s *= arr[face[i][j]];        ret += s;    }    return ret;}void dfs(int dep, vector<int> arr){    ans = max(ans, getSum(arr));    if (dep == 5) {        return ;    }    for (int i = 0; i < 6; i++) {        vector<int> a(arr);        flip(a, i);        dfs(dep + 1, a);        flip(a, i);        flip(a, i);        dfs(dep + 1, a);    }}void debug(){    for (int i = 0; i < 6; i++) {        int a[24];        memset(a, 0, sizeof(a));        cout << i << ":" << endl;        for (int j = 0; j < 24; j++)            a[mp[i][j]]++;        for (int j = 0; j < 24; j++)            printf("%d ", a[j]);        puts("");    }}int main(){    // debug();    // freopen("in1", "r", stdin);    while (true) {        bool isBreak = true;        vector<int> arr(24);        for (int i = 0; i < 24; i++)            if (cin >> arr[i])                isBreak = false;            else                break;        if (isBreak)            break;        ans = -0x3f3f3f3f3f;        dfs(0, arr);        cout << ans << endl;    }    return 0;}
题目2:  在一个数组中,除了一个数字出现一次,其他都出现两次。请找出这个数 注意:你的算法应该是一个线性复杂度。
Example 1 Input: [2,2,3,2] Output: 3 Example 2 Input: [0,1,0,1,0,1,99] Output: 99
int SingleNumber_d(int[] a,int len){  int res = 0;  for(int i=0;i<len;++i)  {    res=res^a[i];  }  return res;}
题目3:给出一个数组,除了一个数出现一次,其他都出现 3 次,请找出这个数。时间复杂度线性范围内。 利用 “位相加” 的方法,对于 int 型的数,我们可以定义一个 bits [32] 的数组,在二进制层面上,按位进行相加,如果数组的数都出现 3 次的话,那么对于每一位相加的和 %3 必然等于 0,现在多了个只出现一次的数,对 3 取余结果不为 0 的那位,必然是只出现一次的数在此位上为 1。这样我们就能计算出这个数了。
int SingleNumber_t1(int[] a,int len){  int bits[32]={0};  // 用于记录每位的和    for(int i=0;i<len;++i)  {    for(int j=0;j<32;++j)    {      bit[j] += (a[i]>>j)&1   // 位操作,记录求和    }  }  // 对求和结果取余,不为0的则为只出现一次的。最后转为10进制结果。  int res=0;  for(int j=0;j<32;j++)  {    if(bits[j]%3 != 0)      res += 1<  }  return res;
题目4:给定一个整数数组,返回两个数字的索引,使它们相加到特定目标。您可以假设每个输入只有一个解决方案,并且您可能不会两次使用相同的元素。
Given nums = [2, 7, 11, 15], target = 9, Because nums[0] + nums[1] = 2 + 7 = 9, return [0, 1].
通过将遍历后的数存到 Map(num-index)中来减少一层循环,并且每次遍历时先判断 map 中是否包含 target - nums [i] 这个值。
public int[] twoSum(int[] nums, int target) {    int[] result = new int[]{-1,-1};    Mapmap = new HashMap();    for (int i = 0; i < nums.length; i++) {        if (map.containsKey(target - nums[i])) {            result[1] = i;            result[0] = map.get(target - nums[i]);            return result;        }        map.put(nums[i], i);    }    return result;}
题目5:给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
Given array nums = [-1, 0, 1, 2, -1, -4], A solution set is: [   [-1, 0, 1],   [-1, -1, 2] ]
注意:答案中不可以包含重复的三元组。 对输入数组进行排序,然后遍历三元组中可能的第一个元素的所有索引。对于每个可能的第一个元素,我们对数组的其余部分进行标准的双向2-sum扫描。我们还希望跳过相等的元素,以避免在不创建集合或smth的情况下在答案中出现重复。
public List> threeSum(int[] num) {    Arrays.sort(num);    List> res = new LinkedList<>();     for (int i = 0; i < num.length-2; i++) {        if (i == 0 || (i > 0 && num[i] != num[i-1])) {            int lo = i+1, hi = num.length-1, sum = 0 - num[i];              while (lo < hi) {                if (num[lo] + num[hi] == sum) {                    res.add(Arrays.asList(num[i], num[lo], num[hi]));                    while (lo < hi && num[lo] == num[lo+1]) lo++;                    while (lo < hi && num[hi] == num[hi-1]) hi--;                    lo++; hi--;                } else if (num[lo] + num[hi] < sum) lo++;                else hi--;           }        }    }    return res;}
题目6:给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。 注意:答案中不可以包含重复的四元组。
示例: 给定数组 nums = [1, 0, -1, 0, -2, 2],和 target = 0。 满足要求的四元组集合为: [   [-1,  0, 0, 1],   [-2, -1, 1, 2],   [-2,  0, 0, 2] ]
class Solution:    def fourSum(self, nums: List[int], target: int) -> List[List[int]]:        #判断输入列表元素个数是否满足基本要求        if len(nums)<4:            return []        #对输入的数值列表中的元素进行从小到大的排序        nums.sort()        list_sum_value=[]        #先固定一个数值        for i in range(len(nums)-3):            #再固定一个数值            for j in range(i+1,len(nums)-2):                left1=j+1                right1=len(nums)-1                #从剩余的列表元素的两端进行运算,根据得到的结果与目标值的大小相比,判断求和的数值是左移还是右移                while left1                    sub_sums=nums[i]+nums[j]+nums[left1]+nums[right1]                    if sub_sums                        left1=left1+1                    elif sub_sums>target:                        right1=right1-1                    else:                        #判断得到的满足求和目标的列表元素是否已经在list_sum_value的存在,避免得到重复的列表                        if [nums[i],nums[j],nums[left1],nums[right1]] not in list_sum_value:                            list_sum_value.append([nums[i],nums[j],nums[left1],nums[right1]])                        left1=left1+1                        right1=right1-1        return list_sum_value
题目7:将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。  示例: 输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
class Solution:    def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:        #先判断出输入的两个链表是否为空        if l1==None:            return l2        if l2==None:            return l1        #将输入的两个链表分别写入两个列表中        value1=l1.val        value_list1=[]        while 1:            value_list1.append(value1)                        if l1.next==None:                break            l1=l1.next            value1=l1.val         value2=l2.val        value_list2=[]        while 1:            value_list2.append(value2)                        if l2.next==None:                break            l2=l2.next            value2=l2.val            #合并两个列表中的元素,并对列表中的元素进行从小到大的排序        all_value_list=value_list1+value_list2        all_value_list.sort()        #将经过排序的列表元素再次写入链表中        l3=ListNode(all_value_list[0])        p1=l3        for i in range(1,len(all_value_list)):            p1.next=ListNode(all_value_list[i])            p1=p1.next        return l3
题目8:给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 注意空字符串可被认为是有效字符串。
示例 1: 输入: "()" 输出: true
class Solution:    def isValid(self, s: str) -> bool:                len_s=len(s)        if len_s%2 !=0:            return False        if len_s==0:            return True        #利用进栈出栈的思想        str_dict={'(':')','[':']','{':'}'}        stacked=[]        for i in range(len_s):            #判断stacked是否为空,以及stacked的最后一个元素是否存在于字典的关键字之中            #判断字符串中的下一个字符是否与stacked中存储的最后一个元素相等,相等则删除stacked中的最后一个元素            #不相等则存入stacked之中,用于接下来的判断            if stacked and stacked[-1] in str_dict.keys() and s[i]==str_dict[stacked[-1]]:                stacked.pop()            else:                stacked.append(s[i])        #若输入为有效字符串则最终stacked中的左右元素将会被完全删除        if stacked==[]:            return True        else:            return False
de150d9e6f3a346126f2dc1c124bd601.png

计算机视觉常见面试题型介绍及解答

第一期 | 第二期 | 第三期 | 第四期 | 第五期 | 

第六期 | 第七期 | 第八期 | 第九期 | 第十期 | 第11期

腾讯算法工程师笔试真题介绍及解析汇总合集

第一期 | 第二期 | 第三期 | 第四期 | 第五期 

 阿里算法岗位最新编程题介绍及解析

第一期 | 第二期 | 第三期 | 第四期 | 第五期 

第六期 | 第七期

华为研发工程师编程题型介绍及解析

第一期 | 第二期 | 第三期 | 第四期 | 第五期 |

第六期 | 第七期 | 第八期 | 第九期 | 第十期 |

字节跳动校招研发岗位笔试编程题型介绍及解析

第一期 | 第二期 | 第三期 | 第四期 | 第五期 | 第六期

ae03a9bea42c8739f4be0d87d25cdbd5.png 6ff728ee938121744a8d4c6f846f020a.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值