最近面试遇到一个算法题,简单写一点。

news2024/11/20 3:24:05

第⼀题(必答)

请针对有重复数字的数组设计⼀个快排算法,⽐如:[34, 34, 89, 1, 1, 20, 12],排序后结果为 [89,34,34,20,12,1,1]

第⼆题(必答) 请利⽤Redis 实现⼀个通⽤分布式锁,并说明您设计⽅案的优点以及还有哪些需要改进的地⽅;

第三题(⾮必答) 编程题:有⼀堆糖果,其数量为n,现将糖果分成不同数量的堆数(每堆数量均为整数,最少为 1),请算出糖果堆对应数量的最⼤乘积是多少,并给出对应的分配⽅案; 举例:糖果数量为8,可以得到的乘积最⼤为18,对应的分配⽅案为【2,3,3】;

第四题(⾮必答) 假设需要设计⼀个承担百万级pv(⽤户总数1千万,每⽇⽤户⾏为⽇志数据预计1亿条)的电商⽹ 站登录系统,你的服务器技术架构是怎么样的?⽤户信息的存储⽅案⼜会如何设计?如果由你来进⾏ 系统整体技术负责,你会如何去把控整体开发进度和协调各⽅⾯资源?

对于 题目1,2,4这里就不详细说了。重点写一下3题的思路(实际上是找规律的题)

第一道题,我写了冒泡,和快速排序来实现

第二道题,事实上就是考验锁的问题,这里给大家点建议,mysql/redis锁都复习一下。

第三道题,

上图,各位看官先,找一下规律(先不要看后面的结论)

 

 

 结论:

由第三道题的分析图可得如下结论(分析图在面试题第三道题画图文件中)
 * 1,数字小于5,直接返回即可(目前不知道这条是否有瑕疵,若有,各位自行修正)
 * 2,数字3是重点
 * 3,保证不能有值为 1 的堆(重要)

下面是我的解题思路:
 * 1,声明一个空数组
 * 2,求出 floor(N/3)有多少个元素, 然后放入数组值为3的floor(N/3)个数
 * 3,判断 N/3 的余数,若为1 则将数组中最小值加上1(此处也可以忽略 可以随便找个元素值加  1), 若为 2则放入数组
 * 4,计算数组中元素的乘积 即可得出想要的值

上代码:

<?php
/**
 * 由第三道题的分析图可得如下结论(分析图在面试题第三道题画图文件中)
 * 1,数字小于5,直接返回即可。
 * 2,数字3是重点
 * 3,保证不能有值为 1 的堆(重要)
 *
 * 解题思路,
 * 1,声明一个空数组
 * 2,求出 floor(N/3)有多少个元素, 然后放入数组值为3的floor(N/3)个数
 * 3,判断 N/3 的余数,若为1 则将数组中最小值加上1(此处也可以忽略 可以随便找个元素值加1), 若为 2则放入数组
 * 4,计算数组中元素的乘积 即可得出想要的值
*/

class ThreeQuestion {
    public $candyArr = [];
    public $message = [
        'numErr' => "糖果数量不能小于或等于0",
        'biggestNum' => "最大乘积为"
    ];
    public function calculationCandyTheBiggestProduct($candyNum){
       if($candyNum <= 0 ){
            return $this->message['numErr'];
       }
       if($candyNum < 5){
           return $this->message['biggestNum'].$candyNum;
       }else{
           $threeTimes = floor($candyNum / 3);
           $remainder = $candyNum % 3;
           //将值为3 放入$this->candyArr 数组,放入个数为$threeTimes
           for($i = 1; $i <= $threeTimes; $i++){
               array_push($this->candyArr,3);
           }
           if($remainder == 1){
               $m = min($this->candyArr); //获取最小值
               $k = array_search($m,$this->candyArr); //通过最小的值来获取对应的键名
               $this->candyArr[$k]+= 1; //最小值加上$remainder
           }elseif($remainder == 2){
               array_push($this->candyArr,$remainder);
           }
           $product = 0 ;
           if(!empty($this->candyArr)){
               $product = array_product($this->candyArr);//计算$this->candyArr数组中元素的乘积
           }
           return $this->message['biggestNum'].$product;
       }
    }

}

$obj = new ThreeQuestion();
echo $obj->calculationCandyTheBiggestProduct('25'); //最大乘积为36
/*
 * 10 = 36
 * 25 = 8748
 * 36 = 531441
 */

第四道题:自己发挥吧,服务器搭建如下

域名----》CND----》防火墙----》负载均衡----》服务器ECS(负载) + 数据库mysql (主从) + 缓存redis(集群) + 缓存ES

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

技术进步、研发计划启动及政策支持 共促我国合成生物学市场容量加速扩张

合成生物学是对生物体进行有目标的设计、改造乃至重新合成&#xff0c;这一名词最早出现于DNA重组技术发展的上世纪70年代。合成生物学汇聚并融合了生命科学、工程学和信息科学等诸多学科&#xff0c;在天然产物合成、化学工业、生物能源、生物医药等诸多领域有广泛的应用前景。…

【Animejs】——Anime.js照片墙案例实现

目录 一、实现的效果&#xff1a; 二、实现js的具体步骤 1、需要实现的逻辑梳理 2、切换风格的逻辑 三、完整代码&#xff1a; 用js编写使用animejs实现图片复杂的切换效果 一、实现的效果&#xff1a; 点击——> <——箭头&#xff0c;实现不同动画效果的炫酷切换 …

【小5聊】C++ 输入矩阵数字,然后回环方式输出

C 输入矩阵数字&#xff0c;然后回环方式输出 1、题目内容 输入 第一行是两个m和n&#xff0c;分别代表矩阵的行数和列数。 第二行开始输入对应矩阵 输出 第二行回转输出。 相邻的两个整数之间用一个空格分开&#xff0c;行尾无空格 样例输入 5 6 4 8 9 4 5 6 1 2 5 6…

控制算法-PID算法总结-从公式原理到参数整定解析

目录 一、控制系统 1.1控制系统的分类 1.2 性能指标 二、PID算法的起源及特点 三、PID应用 四、PID公式原理 五、PID源码 六、PID整定方法 6.1 经验法 6.2 衰减曲线法 6.3 响应曲线法 参考文献&#xff1a; 一、控制系统 1.1控制系统的分类 分为开环控制、闭环控制和…

Java 8 Stream 从入门到进阶——像SQL一样玩转集合

0.阅读完本文你将会 了解Stream的定义和它的特征了解Stream的基础和高阶用法 1. 前言 在我们日常使用Java的过程中&#xff0c;免不了要和集合打交道。对于集合的各种操作有点类似于SQL——增删改查以及聚合操作&#xff0c;但是其方便性却不如SQL。 所以有没有这样一种方式…

【每日一题Day66】LC1754构造字典序最大的合并字符串 | 贪心 双指针模拟

构造字典序最大的合并字符串【LC1754】 You are given two strings word1 and word2. You want to construct a string merge in the following way: while either word1 or word2 are non-empty, choose one of the following options: If word1 is non-empty, append the fir…

10.2、Django入门--前台管理

文章目录1、URLconf 路由管理展示首页2、视图函数处理业务逻辑展示书籍的详细页3、模板管理实现好看的HTML页面3.1 模板引擎配置3.2 模板语法&#xff1a;变量3.3 模板语法: 常用标签3.4 主页与详情页前端HTML设计常用的HTML编写基础标题标签列表标签图片标签链接标签表格标签表…

耗时二周,万字总结Maven简明教程,与君共勉!

什么是Mavne Maven 是一个项目管理工具&#xff0c;它包含了一个项目对象模型 (POM&#xff1a;Project Object Model)&#xff0c;一组标准集合。由于 Maven 使用标准目录布局和默认构建生命周期&#xff0c;开发团队几乎可以立即自动化项目的构建基础设施。在多个开发团队环…

代码随想录训练营第60天|LeetCode 84.柱状图中最大的矩形

LeetCode 84.柱状图中最大的矩形 双指针 注意&#xff0c;双指针解法可行&#xff0c;但是在力扣上提交会超时。 以heights[i]为中心&#xff0c;用两个指针向两边扩散&#xff0c;直到heights[left]和heights[right]小于heights[i]为止&#xff0c;这样就构成了以left和rig…

第11章_数据库的设计规范(理论了解)

第11章_数据库的设计规范 范式 2.3键和相关属性的概念 范式的定义会使用到主键和候选键&#xff0c;数据库中的键(Key)由一个或者多个属性组成。数据表中常用的几种键和属性的定义: 超键︰能唯─标识元组的属性集叫做超键。候选键︰如果超键不包括多余的属性&#xff0c;那…

基于HOG+LBP完成特征工程,基于机器学习模型同时完成人脸识别+表情识别

这周前两天有时间我写了一篇博文&#xff0c;基于LBP和HOG实现人脸好表情特征的提取计算&#xff0c;之后分别训练了人脸识别模型和表情识别模型&#xff0c;在推理阶段实现了单张图像一次性人脸识别和表情识别的计算分析&#xff0c;但这个我前面就说了这个还是间接的实现方式…

关于GC原理和性能调优实践,看这一篇就够了

前言 本文介绍 GC 基础原理和理论&#xff0c;GC 调优方法思路和方法&#xff0c;基于 Hotspot jdk1.8&#xff0c;学习之后你将了解如何对生产系统出现的 GC 问题进行排查解决。 正文 本文的内容主要如下&#xff1a; GC 基础原理&#xff0c;涉及调优目标&#xff0c;GC 事…

Redis原理篇—数据结构

Redis原理篇—数据结构 笔记整理自 b站_黑马程序员Redis入门到实战教程 底层数据结构 动态字符串SDS 我们都知道 Redis 中保存的 Key 是字符串&#xff0c;value 往往是字符串或者字符串的集合。可见字符串是 Redis 中最常用的一种数据结构。 不过 Redis 没有直接使用C语言中…

Python圣诞树

目录 一、前言 二、创意名 三、效果展示 四、实现步骤 五、编码实现 一、前言 一年一度的圣诞节又要来喽~在这么浪漫的节日里怎么能少的了一个浪漫的程序员呢~让我们一起画个圣诞树&#xff0c;送给你喜欢的那个人吧~ 二、创意名 Python浪漫圣诞树&#xff0c;具体源码见&…

嘿ChatGPT,来帮我写代码

最近 ChatGPT 发行了&#xff0c;这是由 OpenAI 开发的AI聊天机器人&#xff0c;专门研究对话。它的目标是使AI系统更自然地与之互动&#xff0c;但是在编写代码时也可以为您提供帮助。您可以让 ChatGPT 做你的编程助理&#xff0c;甚至更多&#xff01;在过去的几天里&#xf…

腾讯云轻量应用服务器使用 SRS 应用镜像搭建个人直播间、视频转播、本地录制!

SRS 是一个开源的流媒体集群&#xff0c;主要应用在直播和 WebRTC&#xff0c;支持 RTMP、WebRTC、HLS、HTTP-FLV 和 SRT 等常用协议。 轻量应用服务器提供了 SRS 应用镜像&#xff0c;使您无需再关注繁杂的部署操作&#xff0c;即可通过该镜像在轻量应用服务器上一键搭建个人…

安卓/华为手机恢复出厂设置后如何恢复照片

绝大多数安卓用户都会经历过手机恢复出厂设置&#xff0c;部分用户可能没有意识到手机恢复出厂设置可能会导致数据丢失。但是&#xff0c;当您在 云盘上进行备份或在设备上进行本地备份时&#xff0c;情况就会有所不同&#xff0c;并且当您将 安卓手机恢复出厂设置时&#xff0…

LeetCode HOT 100 —— 581. 最短无序连续子数组

题目 给你一个整数数组 nums &#xff0c;你需要找出一个 连续子数组 &#xff0c;如果对这个子数组进行升序排序&#xff0c;那么整个数组都会变为升序排序。 请你找出符合题意的 最短 子数组&#xff0c;并输出它的长度。 思路 方法一&#xff1a;双指针 排序 最终目的是让…

大气湍流自适应光学校正算法matlab仿真,包括涡旋光束,大气湍流影响,不同轨道角动量OAM态之间的串扰,校正等

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 涡旋光束是一种具有螺旋波前的光束&#xff0c;在涡旋光束中&#xff0c;决定涡旋光束特性的角量子数可以是任意一个自然数&#xff0c;其不同设置所产生的涡旋光束之间存在正交关系。目前&#…

Android NDK 中堆栈日志 add2line 的分析实践

文章目录目的常用的辅助工具分析步骤参考目的 Android NDK 中出现的 crash 日志分析定位&#xff0c;使用 addr2line 对库中定位so 动态库崩溃位置&#xff0c;定位到某个函数的具体的代码行。 常用的辅助工具 add2line&#xff0c;objdump&#xff0c;ndkstack 等等。本文主要…