首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

当我使用computeIfAbsent计算斐波那契数时,hashmap size()返回不正确的值

当使用computeIfAbsent计算斐波那契数时,HashMap的size()方法返回不正确的值的原因是,computeIfAbsent方法会在计算新值时修改HashMap的内部结构,但是size()方法并不会重新计算HashMap的大小,而是返回HashMap在最后一次扩容之后的大小。

具体来说,computeIfAbsent方法是HashMap中的一个函数式方法,用于根据指定的键计算一个新的值并将其插入到HashMap中。在计算新值时,computeIfAbsent方法会检查HashMap中是否已经存在该键的值,如果存在则直接返回该值,如果不存在则使用指定的计算函数计算新值并插入到HashMap中。

由于computeIfAbsent方法可能会修改HashMap的内部结构,例如插入新的键值对,因此会导致HashMap的大小发生变化。但是size()方法并不会重新计算HashMap的大小,而是返回HashMap在最后一次扩容之后的大小。这就导致了在使用computeIfAbsent方法计算斐波那契数时,HashMap的size()方法返回不正确的值。

为了解决这个问题,可以在使用computeIfAbsent方法计算斐波那契数之后,手动调用HashMap的size()方法重新计算HashMap的大小。可以通过创建一个新的HashMap对象,并将原HashMap中的所有键值对重新插入到新的HashMap中,然后调用新HashMap的size()方法来获取正确的大小。

以下是一个示例代码:

代码语言:txt
复制
import java.util.HashMap;

public class FibonacciCalculator {
    private HashMap<Integer, Integer> cache;

    public FibonacciCalculator() {
        this.cache = new HashMap<>();
    }

    public int computeFibonacci(int n) {
        return cache.computeIfAbsent(n, this::calculateFibonacci);
    }

    private int calculateFibonacci(int n) {
        if (n <= 1) {
            return n;
        } else {
            return computeFibonacci(n - 1) + computeFibonacci(n - 2);
        }
    }

    public int getCacheSize() {
        HashMap<Integer, Integer> newCache = new HashMap<>(cache);
        return newCache.size();
    }
}

在上述示例代码中,我们创建了一个FibonacciCalculator类,其中使用了HashMap作为缓存来存储已计算的斐波那契数。在computeFibonacci方法中,我们使用computeIfAbsent方法来计算斐波那契数,并在计算完成后手动调用getCacheSize方法来获取正确的缓存大小。

请注意,以上示例代码中没有提及腾讯云相关产品和产品介绍链接地址,因为根据要求,不能提及亚马逊AWS、Azure、阿里云、华为云、天翼云、GoDaddy、Namecheap、Google等流行的云计算品牌商。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

《程序员数学:》—— 为什么不能用散列,做数据库路由算法?

这个就是基本定义和特性,并且基于这样特性在计算机科学中,常用于;伪随机生成、AVL二叉树、最大公约数、合并排序算法等。...那么既然 ThreadLocal 是基于散列计算下标索引,为啥数据库路由算法不能使用同样方式计算散列索引呢?因为通过验证可以得知,散列并不满足严格雪崩标准(SAC)。...接下来小傅哥就带着大家一起来使用数据验证下。 二、计算 数列可以通过循环、递归以及封闭式表达式(比奈公式) 方式进行计算。...例如 HashMap 扰动函数。 3. 散列 其实散列是一种特殊形式乘法散列,只不过它乘法因子选择是一个黄金分割比例,所以叫做散列。...乘法散列为什么要用2作为每次扩容条件? 你有了解过 0x61c88647 是怎么计算吗? 散列使用场景是什么?

81140

散列算法和hashMap实践

散列和hashMap实践适合场景:抽奖(游戏、轮盘、活动促销等等)如果有不对地方,欢迎指正!...//计算hash,未使用扰动函数 int idx = key.hashCode() & (res.length - 1); log.info("key{},idx{}",key,idx...散列算法前置条件:生成模拟数据:随机且不重复100个声明散列数组:大小128若有hash冲突,保存map,方便数据查看静态变量声明://黄金分割点private static final int...//map排序if(CollectionUtil.isEmpty(map)){ log.info("额散列数据集:{}",JSON.toJSONString(result)); System.out.println...("===》无重复数据,不需要排序"); return;}mapSort(map);使用散列算法输出结果展示:额散列数据集:38,15,29,22,55,86,70,64,47,32,67,7,60,85,97,95,58,46,14,83,12,72,18,96,36,20,76,59,6,33,50,30,23,42,81,31,66,71,82,61,53,84,41,45,74,63,89,77,90,16,8,37,1,62,65,99,51,78,91,39,5,57,27,56,44,13,92,25,0,24,80,3,94,26,40,34,73,35,88,2,87,11,93,54,69,68,10,17,43,48,19,9,79,21,98,52,4,28,75,49

97400

查找不再迷惑

或者说, 怎么确定数组里裴最大呢?(最后一个) 答:只要刚好能满足我们需要就可以了,裴数组长度,取是大于等于待查找数组长度最小。...不依赖数组查找 我百度“查找”时候, 一大部分基于数组实现代码都是创建了一个长度固定为20数组。...而第20个是6765,所以这样代码只能处理长度小于等于6765数组。...于是就有了另一种编写数组方法: 不依赖数组编码方法 请点这里: 不依赖数组查找 说一下这种方法和我上面介绍方法不同点 我上面介绍版本: 先把算出来,再全部用数组存起来..., 要用时候直接从数组里拿就可以了 这个版本: 不用数组存, 只算出来需要最大, 要用时候“临时”计算就可以了 二分,插和裴查找性能比较 二分查找: 二分查找轨迹可以用一颗判定树来表示

81011

C++模板元编程:利用编译时计算和泛型编程

C++模板机制允许我们使用编译器计算能力,将计算过程转移到编译进行处理,从而避免了运行时开销。 一个经典示例是计算数列。...在传统编程中,我们常常使用递归或循环来计算数列,然而这样方法在大规模计算时会存在性能问题。使用模板元编程方法可以在编译时计算数列,而不需要在运行时进行计算。...Fibonacci // result 变量为 55 return 0;}通过使用模板元编程,我们可以在编译时计算数列,并将结果作为常量存储在编译阶段。...在Fibonacci模板结构体中,我们定义了一个静态常量value来存储。当N大于0,我们使用递归调用来计算前两个数和作为当前。...当N等于0或1,我们定义基准条件,将结果设置为0或1。 在main函数中,我们使用Fibonacci::value来计算第10个

34200

我是如何将递归算法复杂度优化到O(1)

数列就是像蜗牛壳一样,越深入其中,越能发觉其中奥秘,形成一条条优美的数学曲线,就像这样: ?...按照二分递归模式,我们可以再次求和求和问题。...通过 \(Q\)- 矩阵,我们可以利用如下公式进行计算​ \(F_n\): \[ F_n = (Q^{n-1})_{1,1} \] 如此一来,计算数列问题就转化为了求 \(Q\) \(...对于数列这个常见递推数列,其第 \(n\) 项通项公式如下: \[ a_n = \dfrac{(\dfrac{1+\sqrt{5}}{2})^n - (\dfrac{1-\sqrt{5...}}{2})^n}{\sqrt{5}}, (n> = 0) \] 既然作为工科生,肯定要用一些工科生做法来证明这个公式呀,嘿嘿,下面开始我表演~ 我们回想一下,数列所有的可以看成在数轴上一个个离散分布集合

1.2K10

深入浅出理解动态规划(一) | 交叠子问题

任何时候当我们需要求解一个子问题,我们首先查询这个表,如果这个表中有我们预先对该子问题求解结果,则我们直接返回表中这个,否则我们就对子问题进行计算,并把计算结果存入这个表中,以便在后续计算中可以重复使用...下面的程序是求解第n个记忆化搜索版本: /* 求解第n个记忆化搜索程序 */ #include #define NIL -1 #define MAX 100...例如,同样是计算第n个,首先计算fib(0),然后计算fib(1),再计算fib(2),计算fib(3),直到fib(n)。因此,我们采用是自底向上方式逐一建立子问题求解结果表。...下面是打表法求解第n个程序。(所谓打表法,就是把计算结果制成表格,然后打印结果,简称打表法,也称制表法。)...下面通过比较递归法、记忆化搜索方法、打表法在求解第n项时间开销来分析算法优劣性。

1.1K10

[1] 描述 ,通常用 F(n) 表示,形成序列称为数列。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字和。...解题思路 利用递归思想; 当N为0或1返回自身; 当N大于1返回fib(N-2)+fib(N-1) 实现 package Array; /** * Created with IntelliJ...[1] 描述 ,通常用 F(n) 表示,形成序列称为数列。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字和。...解题思路 利用递归思想; 当N为0或1返回自身; 当N大于1返回fib(N-2)+fib(N-1) 实现 package Array; /** * Created with IntelliJ...: https://leetcode-cn.com/problems/fibonacci-number/

28330

数列

我们都知道(也叫兔子)是一组十分有趣数字,首相为1,第二项也是1,之后每一项就是前两项之和,那么该如何实现输入第n项就打印其对应数字呢?...递归实现 事实上,要实现打印并不困难,最简单思路就是递归。 递归就是将计算过程进行提炼,进而得出一段递归。...事实上,当我们输入50,既要打印第50项数字,递归代码就会要运算很长时间,这是因为递归不会记住之前结果,所以求项数越大,就会进行越多重复计算,就会严重拖慢结果打印时间。...循环实现 这个时候就可以使用循环来会解决递归重复进行计算问题了 我们可以将第一项和第二项定义为a和b,c=a+b,然后依次进行推移,就可以实现打印数了 #include int...要是n与b相等则说明n就是,所以最小偏移量就是0。 要是n介于两个之间,就要取距离n最近间距。

47630

查找原理详解与实现

最近看见一个要求仅使用加法减法实现二分查找题目,百度了一下,原来要用到一个叫做查找算法。查百度,是这样说查找与折半查找很相似,他是根据序列特点对有序表进行分割。...他要求开始表中记录个数为某个小1,即n=F(k)-1;  开始将k与第F(k-1)位置记录进行比较(及mid=low+F(k-1)-1),比较结果也分为三种  1)相等,mid位置元素即为所求...mid-1]范围内,k-=1 说明范围[low,mid-1]内元素个数为F(k-1)-1个,所以可以递归应用查找 ---- 大部分说明都忽略了一个条件说明:n=F(k)-1, 表中记录个数为某个小...std; const int max_size=20;//数组长度 /*构造一个数组*/ void Fibonacci(int * F) {...(n>F[k]-1)//计算n位于数列位置 ++k; int * temp;//将数组a扩展到F[k]-1长度 temp=new int [F[k]-

1.8K80

数列

0x01 刷抖音突然刷到了数列,突发奇想就用java写一个数列。虽然很早之前学习算法,这应该是最基本,但是对于一个干着普普通通工作我已经是需要深思熟虑一番。...0x02 数列是指从第3个开始,每个数都是前两个数和。数列前几个数字如下所示:0、1、1、2、3、5、8、13、21、34、55、89……以此类推。...数列在数学和计算机领域具有广泛应用。它们可以描述自然界中许多现象,如植物分枝、螺旋线形状等。在编程中,数列常用于解决一些递归问题,也被用于算法优化和动态规划等方面。...public class Feibonaqi { public static void main(String[] args) { int n = 3; // 要计算数列长度...第三个方法是我询问 gpt 怎么使用递归方式写,gpt给出答案。 看到那一刻唤醒了记忆,这应该是最优写法。 0x04 长期没有数学思考,已经缺乏了数学思维。所以写很烂。

22110

【重修Python】谈一谈递归

4月 5月 6月 7月 8月 9月 10月 11月 1 1 2 3 5 8 13 21 34 55 89 144 这也非常著名数列...,如下: # 数列 def fibonacci(n): if n == 0: return 0 elif n == 1: return 1...但是还没有完,往往我们递归问题出在后面的异常超时等问题。 Stack overflow ①当我们终止条件不正确时候,见下图 如果上述阶乘案例中,不小心将-错写成了+。...拿常规写法举例(见前言中案例),如果n设置为100,那么你将会看到控制台像卡住一样得不到结果(你需要进行大约 1.67 亿次递归调用)。...maxsize=None 表示缓存大小没有限制。这将缓存所有已计算,从而减少时间复杂度。 请注意,这种方法在计算可能会消耗大量内存。

41140

【C语言】求数列第n位

数列------从第三项开始,每一项都等于前两项之和;而第一项和第二项都是1 1.非递归方法实现 主函数部分,定义变量,初始化变量,输入想求数列第n位 n int main()...,然后将a+b赋给c,即为从第三项开始,每一项都等于前两项之和;每次相加完赋值之后,将b赋给a,c赋给b,迭代下去;从第二位开始,每迭代一次就能得到下一位,所以想求第n位...c; } printf("%d\n", c); } else printf("%d\n", a); return 0; } 使用非递归方法计算数列第...n位,效率会快很多,但当数值过大无法计算出准确. 2....递归方法实现 当n>2使用递归返回前一位和前两位和;当n<=2返回1.

13010

递归理解与实现

❝知其然知其所以然 前言 我们在写业务代码时候,或多或少都会遇到需要使用递归场景,比如在遍历树形结构。...求 求特定位置,用递归实现代码很简单,接下来我们先看下概念。...0号位置是0 1号位置是1 n(n>1)号位置等于 n-1位置 + n-2位置 我们知道怎么计算后,就可以用递归来将其实现了。...我们可以将上述递归理解中应用到求里,实现思路和实现代码如下: Base case: 0号位置是0,1号位置是1。...返回到F(3),与第3步一样,获取其右子树,然后重复第3至6步步骤,直至计算出F(3)和F(2),将其相加就得出了F(4),此时F(4)处就是我们需要求,即图中第6~16

46120

Java 8 函数式编程Java 8 函数式编程

.* @FunctionalInterface 都是函数接口,没有成员(状态) 高阶函数:参数或返回为函数 方法引用:类名::方法名 可以 类名::new、String[]::new 流操作 Stream.of...("-1", "0", "1") // 生成 .map(函数) // 映射 .filter(返回布尔函数) // 过滤器(重构:找for中if) .flatMap(函数) // 平面映射:多个流合并...// 完工者:转换为想要结果类型 Set characteristics(); // 特征:返回不可变集合 .collect(Collectors.toList(...public interface Supplier { T get(); } // 判定:返回布尔函数 Predicate { boolean test(T t); and; 否定...= 0); } 使用 Map computeIfAbsent 方法高效计算数列。 这里“高效”是指避免将那些较小序列重复计算多次。

1.1K30

LeetCode题解—数列

前言 今天继续算法题:数列 题目:数列 写一个函数,输入 n ,求(Fibonacci)数列第 n 项(即 F(N))。...数列定义如下: F(0) = 0 F(1) = 1 F(N) = F(N - 1) + F(N - 2) 其中 N > 1....数列由 0 和 1 开始,之后就是由之前相加而得出。 答案需要取模1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。...示例 1:输入:n = 2 输出:1 示例 2:输入:n = 5 输出:5 提示:0 <= n <= 100 解法一 数列,面试中还是比较常遇到,比较经典一个题目。...n=1时候,按道理来不用进入循环,直接返回b1,跟上述a冲突了。所以选择进入循环一次,给a赋值了b,然后返回a,也就是1。

1K10

数列问题

前言 假如面试官让你编写求数列代码,是不是心中暗喜?不就是递归么,早就会了。如果真这么想,那就危险了。 递归解法 递归,在数学与计算机科学中,是指在函数定义中使用函数自身方法。...编译: gcc -o fibo fibo.c 运行计算第5个: $ time ....但是特别注意是,这种改进版递归,虽然避免了重复计算,但是调用链仍然比较长。 迭代解法 既然递归法不够优雅,我们换一种方法。如果不用计算计算,让你去算第n个,你会怎么做呢?...50个: $ gcc -o fibo1 fibo1.c $ time ....数列应用 关于数列在实际中很常见,数学上也有很多奇特性质,有兴趣可在百科中查看。

58310

【愚公系列】2021年11月 C#版 数据结构与算法解析(查找)

查找是区间中单峰函数搜索技术,它在二分查找基础上根据数列进行分割。...在数列找一个等于或略大于查找表中元素个数F[n],如果原查找表长度不足F[n],则补充重复最后一个元素,直到满足F[n]个元素为止。...完成后进行分割,即F[n]个元素分割为前半部分F[n-1]个元素,后半部分F[n-2]个元素,根据关系确定往前或往后查找,直到找到时为止。如果一直找不到,则返回-1。...void CalculateFibonacci() { _fibonacciArray[0] = 1; _fibonacciArray[1] = 1; //计算...,使用数组保存中间结防止重复计算, //注意MAXSIZE为48将会溢出整型范围。

14820

Python 算法基础篇:数列问题动态规划解法

如果 n 小于等于 1 ,则直接返回 n ;否则,返回前两个和。 递归解法思想简单明了,但它存在重复计算问题,对于较大 n 会导致大量重复计算,从而效率较低。 3....在数列问题中,第 n 个等于前两个之和。...在数列问题中,边界条件已经在状态转移方程中进行了初始化,因此我们只需返回 dp [ n ]即为第 n 个。...(n)}") 代码解释:上述代码演示了使用动态规划解决数列问题实例。...由于动态规划将问题分解为子问题,并保存子问题解,避免了重复计算,因此在处理较大规模问题表现出色。 总结 本篇博客重点介绍了数列问题动态规划解法。

37450

扫码

添加站长 进交流群

领取专属 10元无门槛券

手把手带您无忧上云

扫码加入开发者社群

相关资讯

热门标签

活动推荐

    运营活动

    活动名称
    广告关闭
    领券