友塔游戏测试开发笔面经验

题目一

给定任意非负整数M,判断其能否表达为 M = 2 ^a + 2 ^b(a和b为非负整数),若可以输出a和b,若不能输出-1;

例如: 输入:6 输出: “1 2”

分析:

void findAB(int M){} 为解决问题的主函数

流程

  1. 若 M <= 0, 2的幂次无法为0,故认为无解,直接返回 “-1”
  2. 检查M是否是2的幂次方,如果是,直接输出 “0 log2(M)”
  3. 用两层循环遍历所有可能得a值和b值查找可能得结果,检查的范围限定在 a 在 [0, log2M], b 在 [a + 1, log2M], b 从 a+ 1开始是为了避免重复, a 和 b 相同且为结果在

第二步就能求出,即 $ 2 ^a + 2^a = 2^(a+1) $

代码

// 函数用于判断一个数是否是2的幂次方
bool isPowerOfTwo(int n)
{// n 不能为0// 且n的二进制表示只有一个1, n & (n - 1) 将 n 最右边的1变为0return (n && !(n & (n - 1)));
}string findAB(int M)
{if(M <= 0){return "-1";}// 检查M是否是2的幂次方,如果是,直接输出if(isPowerOfTwo(M)){return "0 " + to_string((int)log2(M));}for(int a = 0; a <= log2(M); ++a){for(int b = a + 1; b <= log2(M); ++b)  // b从a+1开始,避免重复{if(pow(2, a) + pow(2, b) == M){return to_string(a) + " " + to_string(b);}}}return "-1";
}

题目二

圆上按顺序有编号1到n的n个点。两点间连线,连过线的点不与其他点相连。要求这些线都不相交,n为偶数时最终有 n/2条线,n为奇数时有 (n - 1) / 2条线,输入点的个数n,输出满足要求的方法数量。

例如:

输入:4

输出: 2

函数原型为 int solution(int n)

分析

对于给定的n个点(n为偶数),以这些点为端点连互不相交的弦的方法数量就是第n/2个卡塔兰数。

卡塔兰数的递推公式为

在这里插入图片描述

对于n个点连接不相交弦的问题,由于每条弦都会将圆分成两部分,每一部分内的弦也必须满足不相交的条件,因此问题可以递归地分解成更小的子问题,这正好对应卡塔兰数的定义。

但是n为奇数的时候,要保证所有连线不相交,则相交线数量为 (n - 1) / 2 ,且必然有一个点没被连接,所以可以任取一个点作为没被连接的点,从而得不相交弦的方法数量为:
n*C((n - 1) / 2)

unsigned long long catalan(unsigned int n)
{if(n <= 1) return 1;vector<unsigned long long> C(n + 1, 0);C[0] = C[1] = 1;// 递推式的循环表示for(unsigned int i = 2; i <= n; ++i){for(unsigned int j = 0; j < i; ++j){C[i] += C[j] * C[i - j - 1];}}return C[n];
}// 核心主函数
unsigned long long chordCount(int n)
{if(n % 2 != 0){// 奇数的情况return n * catalan((n - 1) / 2);}else{return catalan(n / 2);}
}

解法二

int solution(int n) {// 卡特兰数通常用于解决此类问题// dp数组用于存储结果,dp[i]表示i个点形成非交叉连线的方法数vector<int> dp(n + 1, 0);dp[0] = 1; // 没有点时认为有一种方法dp[2] = 1; // 两个点只有一种连接方式// 填充dp数组for (int i = 4; i <= n; i += 2) { // 只考虑偶数个点,因为奇数个点不可能完全配对for (int j = 0; j < i - 1; j += 2) {// dp[i]累加上dp[j](左侧的点形成的配对方式)* dp[i - j - 2](右侧的点形成的配对方式)dp[i] += dp[j] * dp[i - j - 2];}}return (n % 2) ? (n * dp[n - 1]) : dp[n];
}

题目三

小游戏是一个正八边形,每条边有打开(1),关闭(0)两种状态,每次执行游戏选定一条边,把该边和其相邻的两条边(共三条)改为格子相反的状态。如三边为1 0 1,选定中间边进行一次操作结果为 0 1 0 。输入一个一维数组M(数字0或1)表示八条边的初始状态,输出最少需要多少次可以把八条边都置位0。

例如:

输入:[0, 0, 0, 0, 0, 0, 0, 1]

输出 : 5

函数原型为int solution(vector<int> M)

分析

解决该问题的方法是如何通过有限的操作将八边形的每条边都转为0状态。由于问题规模较小,可用位运算和穷举来寻找最优解。

每一条边的状态可以用一个8位的二进制数表示,每位代表一条边的开或关状态。因此,可以通过【遍历所有可能的操作序列】来找到将所有边都转换为0状态的最小操作次数。

使用双层循环来遍历每一种翻转的情况:

for (int seq = 0; seq < (1 << 8); ++seq) {

这个循环遍历所有可能的操作序列。seq变量代表当前的操作序列,用一个8位的二进制数表示,其中每一位对应于八边形的一条边是否被选择进行操作。所以一共 2^8种情况。

内层循环如下:

for (int j = 0; j < 8; ++j) {if (seq & (1 << j)) {state = flip(state, j);steps++;}}

这个循环遍历当前操作序列seq的每一位,检查每一条边是否被选择进行操作。

seq & (1 << j)是位操作,检查seq的第j位是否为1。如果结果非0,意味着在当前操作序列中,第j条边被选中进行操作。

如果第j条边被选中,那么调用 flip(state, j) 函数翻转第j条边及其相邻两条边的状态。state变量代表当前的边状态,是一个8位的二进制数,每一位对应一条边的开或关状态。

steps++记录了进行当前序列操作所需的步数。

最后进行检查和更新最少操作次数

if (state == 0) {minOperations = min(minOperations, steps);}

代码

int flip(int state, int index)
{// 翻转当前位state ^= 1 << index;state ^= 1 << ((index + 7) % 8);state ^= 1 << ((index + 1) % 8);return state;
}int solution(vector<int> M)
{int initialState = 0;for(int i = 0; i < 8; ++i){initialState |= M[i] << i; // 初始化状态}int minOperations = INT_MAX;// 尝试所有可能的操作序列,见分析// 如seq = 3 = 0000 0011 , 即代表最前面两位进行翻转操作,其余不动for(int seq = 0; seq < (1 << 8); ++seq){int state = initialState;int steps = 0;for(int j = 0; j < 8; ++j){if(seq & (1 << j)) // 检查第j位是否为1, 若是,则翻转{state = flip(state, j);steps++;}}if(state == 0){minOperations = min(minOperations, steps);}}return minOperations == INT_MAX ? -1 : minOperations;
}

面试题

  • 介绍一下对测试理解
  • 复盘笔试题,第二题
  • 假设有1,2,3,4,5 分别有权重10,20,30,40,50,实现随机取5个数中的一个(权重求和,然后从0和之间取随机数,落在110就返回1,落到21~40就返回2,依次类推)

其他记不清了,面试官说主要用python开发,开发测试工具为主,测试有单独测试人员主要负责。

已收到感谢信。。。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/543457.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

优选算法[1]

目录 1.双指针&#xff1b; 2.滑动窗口&#xff1b; 3.二分查找&#xff1b; 4.前缀和&#xff1b; 1.双指针&#xff1b; 包括对撞指针和快慢指针(一般用来循环&#xff09;&#xff1b; 题目类型&#xff1a;移动零&#xff0c;复写零&#xff0c;快乐数&#xff0c;盛…

【每日力扣】235. 二叉搜索树的最近公共祖先与39. 组合总和问题描述

&#x1f525; 个人主页: 黑洞晓威 &#x1f600;你不必等到非常厉害&#xff0c;才敢开始&#xff0c;你需要开始&#xff0c;才会变的非常厉害。 235. 二叉搜索树的最近公共祖先 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义…

Python中类方法和静态方法的区别你知道吗?

​1.类方法 通过 classmethod 装饰器修饰的方法就是类方法 类方法可以通过类名或对象名调用&#xff0c;但是一般情况下使用类名调用&#xff08;节省内存&#xff09; 类方法中没有self.在类方法中不可以使用其它对象的属性和方法 类方法中一般会有一个参数cls&#xff0c;…

Crc冗余校验码设计

串行电路的位置&#xff0c;有异或门的地方是1&#xff08;生成多项式&#xff09; 简单的来说&#xff0c;如果最高位Q4 为0 的话&#xff0c;那么直接和 0 进行异或的话&#xff0c;实现的也是自己本身&#xff0c;直接左移就可以了 如果最高是1的话&#xff0c;那么就要和生…

【数据结构与算法】:选择排序与快速排序

&#x1f525;个人主页&#xff1a; Quitecoder &#x1f525;专栏&#xff1a;数据结构与算法 我的博客即将同步至腾讯云开发者社区&#xff0c;邀请大家一同入驻&#xff1a;腾讯云 欢迎来到排序的第二个部分&#xff1a;选择排序与快速排序&#xff01; 目录 1.选择排序1.…

如何export windows中的环境变量

在大语言模型&#xff08;LLM&#xff09;学习过程中&#xff0c; 利用 jupyter 导入环境变量时出现以下问题&#xff0c; C:\Users\zhangxuantao>export SENSENOVA_SKxxxxxx export 不是内部或外部命令&#xff0c;也不是可运行的程序 或批处理文件。 原因是学习教程中用…

VTK安装(C++)并配置vs

准备工作&#xff1a; 1.VTK下载包(此教程使用VTK8.2.0) 2.CMAKE(此教程使用3.29.0) 在此不过多赘述&#xff0c;可在网上搜索cmake安装 3.visual studio(此教程使用vs2019) VTK下载及编译&#xff1a; 1、找到自己适合的VTK版本,我选择的是VTK8.2.0。 1.1 官网下载&#xff…

天水麻辣烫榜上有名!2024适合普通人的创业项目!2024最适合创业的三大行业!2024热门创业项目!

1、天水麻辣烫 最近济南6天开了4家甘肃麻辣烫天天爆满 有店日营业额破万元有店主飞甘肃天水学习5天回来迅速开店&#xff01;选择天水麻辣烫作为创业项目绝对是一个明智的选择。趁着现在的热度&#xff0c;开设一家门店&#xff0c;借助其已经积累的名气和口碑&#xff0c;创业…

Docker常用命令的使用及镜像的构建

1.docker的好处 在开发中可能会遇到一个问题&#xff0c;一个程序在自己电脑上能跑&#xff0c;但是换到服务器上就不行了。如果我们重新搭建环境&#xff0c;需要重新部署mysql,es,redis等组件很麻烦。有了docker之后&#xff0c;我们可以快速完成项目的部署。同时docker的隔…

L1-072 刮刮彩票 分数 20 (巧用一维数组,数组加和)

啊啊啊啊啊啊啊啊明明就想出来了&#xff0c;明明就&#xff0c;就差这2分为什么为什么啊&#xff01;&#xff01;&#xff01;忘记当 tt 大于3小于6时应该 - 3 了&#xff0c;哎呦喂&#xff0c;三位的数组哪有4&#xff0c;5&#xff0c;6啊啊啊啊啊忘记减了&#xff0c;忘了…

C语言数据结构(7)——树、二叉树前言

欢迎来到博主的专栏——C语言数据结构 博主ID&#xff1a;代码小豪 文章目录 树二叉树特殊二叉树满二叉树完全二叉树 完全二叉树的存储结构 树 树是一个非线性的数据结构&#xff0c;由N个结点构成的集合。 树的各个结点由一个根结点联系起来&#xff0c;这个根节点没有前驱…

电子科技大学链时代工作室招新题C语言部分---题号E

1. 题目 这道题大概的意思是说&#xff0c;一座城市中被埋了许多雷&#xff08;用一个只含0和1的字符串表示城市&#xff0c;1代表有雷&#xff0c;0代表无雷&#xff09;。 你作为一个排雷兵&#xff0c;需要花最少的钱引爆所有的雷来使城市中不再有雷&#xff08;太逆天了&a…