一个通过下标查找数值的面试题解法

最近看到一道面试题,面试官说是算法题。我粗略看了下,努力在其中寻找数学公式,但是最后发现它算是一个数据结构相关的题目,没有算法层面的知识。

// There is an array generated by a rule.
// The first item is 1. If k is in the array, then k3 +1 and k2+1 are in the array.
// The array is sorted. There are no duplicate values.
// Please write a function that accepts an input N. It should return the index N of the array.
// For example [1, 3, 4, 7, 9, 10, 13, 15, 19, 21, 22, 27, …] n=10, return 22
function getNumberFromTheArray(N) {
return 22;
}
console.log(getNumberFromTheArray(5)) // 10;
console.log(getNumberFromTheArray(10)) // 22;

这题大体意思是有序数组是由数组中的数字K,以及3K+1、2K+1构成,即这是一个迭代生成的问题。然后通过下标找到数组中的值。
我们先看数组中相邻的两个数组(X, Y),假设Y = X+n。则通过X生成的数字是

  • 2X+1
  • 3X+1
    通过Y生成的数字是:
  • 2Y+1=2(X+n)+1
  • 3Y+1=3(X+n)+1
    基于上面的式子我们可以得出
  • 2X+1<2Y+1
  • 3X+1<3Y+1
    但是不能确定3X+1和2Y+1的大小。
    这样可以确定的是:我们通过相邻的两个数字(X,Y),只能确定最小的数字是2X+1。
    后面的思路也是基于这个展开。
    2K+1和3K+1数组是递增的,所以新的数据产生后只要向其尾部插入即可。
    一旦游标的位置移动到结果数字的最后一位,就会触发2K+1和3K+1数组第一个元素的对比,然后将小的数字从原数组中删除,并插入到结果数组的最后一位。
    在这里插入图片描述

class ValueGenerator:
    def __init__(self, start):
        self._start_value = start
        self._calc_index = -1
        self._2k_plus_1 = []
        self._3k_plus_1 = []
        self._sorted = [start]

    def get_number_from_the_array(self, index):
        self._index = index
        return self._calc(self._start_value)
    
    def _calc(self, value):
        while self._calc_index < self._index:
            if self._calc_index + 1 < len(self._sorted):
                value = self._sorted[self._calc_index + 1]
                self._2k_plus_1.append(2*value + 1)
                self._3k_plus_1.append(3*value + 1)
                self._calc_index = self._calc_index + 1
            else:
                if len(self._2k_plus_1) == 0 and len(self._3k_plus_1) == 0: 
                    return -1
                elif len(self._2k_plus_1) == 0:
                    self._sorted.append(self._3k_plus_1[0])
                    self._3k_plus_1.remove(self._3k_plus_1[0])
                elif len(self._3k_plus_1) == 0:
                    self._sorted.append(self._2k_plus_1[0])
                    self._2k_plus_1.remove(self._2k_plus_1[0])
                else:
                    _2K_plus_1 = self._2k_plus_1[0] if len(self._2k_plus_1) > 0 else 0
                    _3K_plus_1 = self._3k_plus_1[0] if len(self._3k_plus_1) > 0 else 0
                    cur_min_value = 0
                    
                    if _2K_plus_1 < _3K_plus_1:
                        cur_min_value = _2K_plus_1
                        self._2k_plus_1.remove(cur_min_value)
                    elif _2K_plus_1 == _3K_plus_1:
                        cur_min_value = _3K_plus_1
                        self._2k_plus_1.remove(cur_min_value)
                        self._3k_plus_1.remove(cur_min_value)
                    else:
                        cur_min_value = _3K_plus_1
                        self._3k_plus_1.remove(cur_min_value)

                    if self._sorted[-1] < cur_min_value:
                        self._sorted.append(cur_min_value)
        return self._sorted[self._index]
                
            
if __name__ == "__main__":
    value_generator = ValueGenerator(1)
    print(value_generator.get_number_from_the_array(1))
    print(value_generator.get_number_from_the_array(10))
    print(value_generator.get_number_from_the_array(100))
    print(value_generator.get_number_from_the_array(1000))
    print(value_generator.get_number_from_the_array(10000))
    print(value_generator.get_number_from_the_array(100000))
    print(value_generator.get_number_from_the_array(1000000))

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Codeforces Round 918 (Div. 4) 解题报告 | 珂学家 | 偏序 + 扩展Dijkstra

前言 整体评价 属于VP&#xff0c;感觉还是能AK的&#xff0c;E是偏序题&#xff0c;F是改版的迪杰特斯拉。 A. Odd One Out 题型: 签到 t int(input())for i in range(t):a, b, c list(map(int, input().split()))if a b:print (c)elif a c:print (b)else:print (a)B. …

基于Python的全国主要城市天气数据可视化大屏系统

1 绪论 1.1 研究的目的与意义 近年来&#xff0c;气候变化引发全球范围内的关注。天气数据的采集和分析对于气候预测、生态环境保护等方面都起着至关重要的作用。同时&#xff0c;随着科技的不断发展&#xff0c;数据可视化已经成为了许多领域中不可或缺的一部分。基于此&…

防御保护 笔记整理

一、ASPF--- 针对应用层的包过滤 ASPF --- 针对应用层的包过滤 --- 用来抓取多通道协议中协商端口的关键数据包&#xff0c;之后&#xff0c;将端 口算出&#xff0c;将结果记录在sever-map表中&#xff0c;相当于开辟了一条隐形的通道。 FTP --- 文件传输协议 FTP协议是一个典…

指针进阶1

一&#xff0c;字符指针 顾名思义&#xff1a;字符指针指的是一种指针类型为字符指针 char*&#xff1b; char*可以是一个字符也可以是一个字符串&#xff0c;前者很好理解&#xff0c;让我们看看后者&#xff1b; eg&#xff1a;char*p"abcdef";//实际上是将首元…

【开源精选导航】GitHub-Chinese-Top-Charts:一榜在手,优质中文项目轻松找寻

各位热爱开源技术的朋友们&#xff0c;你们是否有过这样的困扰&#xff1a;面对浩瀚的GitHub海洋&#xff0c;想找寻那些具有高质量中文文档的优秀开源项目却无从下手&#xff1f;今天&#xff0c;我们就为大家揭晓一个宝藏般的开源项目——GitHub 中文项目集合&#xff08;访问…

如何在win系统部署Apache服务并实现无公网ip远程访问

文章目录 前言1.Apache服务安装配置1.1 进入官网下载安装包1.2 Apache服务配置 2.安装cpolar内网穿透2.1 注册cpolar账号2.2 下载cpolar客户端 3. 获取远程桌面公网地址3.1 登录cpolar web ui管理界面3.2 创建公网地址 4. 固定公网地址 前言 Apache作为全球使用较高的Web服务器…

idea项目如何上传gitee

1.先创建仓库 2.从gitee上面clone下来 3.配置一下git 4.在idea里面安装Gitee插件&#xff08;安装完插件重启一下&#xff09; 5.将项目提交到远程仓库 git->add->✔ 完后点击↗ 在码云如何获取token&#xff1f; 注&#xff1a;没有解决&#xff0c;有时间在继续研究

linux kernel 内存踩踏之KASAN(一)

一、背景 linux 内核出现内存类问题时&#xff0c;我们常用的调试工具就是kasan&#xff0c;kasan有三种模式&#xff1a; 1. Generic KASAN &#xff08;这个就是我们最常用的&#xff0c;1 debug byte indicate 8 bytes use state, 对标用户层 asan&#xff09; 2. Softwa…

滴滴举行网约车合作伙伴大会,与174家合作伙伴共商发展

近日&#xff0c;滴滴在昆明举行主题为“凝心聚力&#xff0c;共享发展”的第四届网约车合作伙伴大会&#xff0c;汽车租赁公司、司机服务公司、主机厂、金融机构等174家上下游生态链合作伙伴齐聚一堂。滴滴已连续四年举办网约车合作伙伴大会&#xff0c;邀请合作伙伴广泛参与、…

机器学习 | 掌握 K-近邻算法 的理论实现和调优技巧

目录 初识K-近邻算法 距离度量 K值选择 kd树 数据集划分 特征预处理 莺尾花种类预测(实操) 交叉验证与网格搜索 初识K-近邻算法 K-近邻算法&#xff08;K-Nearest Neighbor&#xff0c;KNN&#xff09;是一种基本的分类和回归算法。它的基本思想是通过找出与新对象最近…

万户 ezOFFICE DocumentEdit_unite.jsp SQL注入漏洞复现

0x01 产品简介 万户OA ezoffice是万户网络协同办公产品多年来一直将主要精力致力于中高端市场的一款OA协同办公软件产品,统一的基础管理平台,实现用户数据统一管理、权限统一分配、身份统一认证。统一规划门户网站群和协同办公平台,将外网信息维护、客户服务、互动交流和日…

一文速学-selenium高阶操作连接已存在浏览器

前言 不得不说selenium不仅在自动化测试作为不可或缺的工具&#xff0c;在数据获取方面也是十分好用&#xff0c;能够十分快速的见到效果&#xff0c;这都取决于selenium框架的足够的灵活性&#xff0c;甚至在一些基于web端的自动化办公都十分有效。 通过selenium连接已经存在…

[NCTF2019]Fake XML cookbook(特详解)

先试了一下弱口令&#xff0c;哈哈习惯了 查看页面源码发现xml function doLogin(){var username $("#username").val();var password $("#password").val();if(username "" || password ""){alert("Please enter the usern…

【三】【C++】类与对象(二)

类的六个默认成员函数 在C中&#xff0c;有六个默认成员函数&#xff0c;它们是编译器在需要的情况下自动生成的成员函数&#xff0c;如果你不显式地定义它们&#xff0c;编译器会自动提供默认实现。这些默认成员函数包括&#xff1a; 默认构造函数 (Default Constructor)&…

设计模式之框架源码剖析(实战+图解)

Java设计模式 1&#xff0c;概述 随着软件开发人员人数的增多&#xff0c;一些公司急需一些高端人才。作为一个高端人才&#xff0c;设计面向对象软件是必不可少的能力&#xff0c;而软件设计是需要很深的功力&#xff0c;设计模式就要求你必须掌握。 2&#xff0c;本章特色…

中国地区cetos7.9 install kubeadmin

第 1 步&#xff1a;禁用 SELinux&#xff08;可选但推荐&#xff09; 如何在 CentOS 7 上查找 SELinux 状态 sestatus另一种选择是运行以下 cat 命令&#xff1a; vi /etc/selinux/config SELINUXdisabled rebootcentos7 linux 安装k8s前下面操作的作用是&#xff1f; cat…

基于JAVA的河南软件客服系统 开源项目

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统管理人员2.2 业务操作人员 三、系统展示四、核心代码4.1 查询客户4.2 新增客户跟进情况4.3 查询客户历史4.4 新增服务派单4.5 新增客户服务费 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的河…

day38_MySQL

今日内容 0 复习昨日 1 引言 2 数据库 3 数据库管理系统 4 MySQL 5 SQL语言 0 复习昨日 1 引言 1.1 现有的数据存储方式有哪些&#xff1f; Java程序存储数据&#xff08;变量、对象、数组、集合&#xff09;&#xff0c;数据保存在内存中&#xff0c;属于瞬时状态存储。文件&…

Google Chrome 常用的几个参数

1 右键--Google Chrome--属性--目标 参数作用--disable-infobars此计算机将不会再收到 Google Chrome 更新&#xff0c;因为 Windows XP 和 Windows Vista 不再受支持。适用于 xp、2003 的 49.x.x.x 版本。示例1--ingore-certificate-errors忽略证书错误--disable-background-…

开源知识库:让企业低成本实现知识管理

管理和利用企业内部知识已经成为提升效率和竞争力的重要手段。而对于大多数企业&#xff0c;尤其是中小企业而言&#xff0c;如何在有限的预算下&#xff0c;实现高效的知识管理&#xff0c;仍是一项挑战。面对这一问题&#xff0c;开源知识库应运而生。今天&#xff0c;我们将…