等额本息的求解之路

房贷计算器

等额本息

年利率:
贷款金额(万元):
贷款期数:
期数 每月还款 当月还的本金 累计还的本金 还欠的本金 当月还的利息 累计还的利息 累计还的利息 + 累计还的本金
{{n}} {{perMonthMoney}} {{c1.get(n)}} {{c2.get(n)}} {{c5.get(n)}} {{c4.get(n)}} {{c3.get(n)}} {{c6.get(n)}}

等额本息的意思是,本金加利息是等额的,所以每个月的还款额是一样的。等额本金说的是每个月还的本金是一样的,所以随着本金越还越少,则相应的利息部分越来越少。

假设我们借了 12 万块,等额本息,分 12 个月还,那么我们可以列出这样的等式,来理解计算过程,帮助我们求出每个月的还款额。其中 p 表示月利率,月利率等于年利率除以 12 个月,A 是我们要求的每月还款额。在这个例子中,我们假设年利率为百分之 6.

a0 = 12;# 这表示我们借了 12 万的本金

a1 = a0 * (1 + p) - A; # 第一个月的利息加本金,减去还款额 A,表示还款了一个月后,未还的钱

a2 = a1 * (1 + p) - A; # 以此类推

an = an-1 * (1 + p) - A; # 当第 12 月的时候,全部还完,当 n =12 时,则这个等式的左右 2 边都为 0。

怎么根据这些例子来求出 A 值呢,我先编程实现了这样一段代码。

继续阅读“等额本息的求解之路”

求两直线的交点

继续阅读“求两直线的交点”

如何模拟贝塞尔曲线上的点

刚接触觉得贝塞尔还是挺复杂的,n 阶贝塞尔的数学公式都把我吓退了。实现起来还是比较简单的,效果如下,代码可以审查元素获得。

记一个朋友遇到的腾讯面试题

朋友面试腾讯,遇到了一个算法题,挺有意思的,特此记录一下。题目是这样的,给定一个数组如下:

let arr = [
  ["a", "aa", "aaa", "aaaa"],
  ["b", "bb", "bbb"],
  ["a", "ab", "aba"],
  ["a", "aa", "aab"]
]

将其转化成一个树状的子结构,如下:

[
  {
    name: "a",
    child: [
      {
        name: "aa",
        child: [
          {
            name: "aaa",
            child: [
              {
                name: "aaaa",
                child: [],
              },
            ],
          },
          {
            name: "aab",
            child: [],
          },
        ],
      },
      {
        name: "ab",
        child: [
          {
            name: "aba",
            child: [],
          },
        ],
      },
    ],
  },
  {
    name: "b",
    child: [
      {
        name: "bb",
        child: [
          {
            name: "bbb",
            child: [],
          },
        ],
      },
    ],
  },
];
继续阅读“记一个朋友遇到的腾讯面试题”

Trie 的简易版 js 实现

Trie 能解决什么问题?

假设我们有一个数组:['tiger', 'monkey', 'elephant', 'dog'],我们想要查找里面有没有 dog,最简单的方法是遍历数组,如果要查 10000 次,则遍历数组的次数是 1w * 4 = 4w;如果我们用 trie 来解决这个问题,则会大大的提升我们的速度。构建 trie 的遍历次数是 5 + 6 + 7 + 3 = 21,再查询 10000 次,则是 10000 * 3 + 21 = 30021。很明显,查询次数越多,trie 的性能优势就越明显。

上面的计算可能并不专业,仅供参考。

继续阅读“Trie 的简易版 js 实现”

线段树的 js 实现

Segment tree 可以用来解决一些区间的问题。比如说有 100 个元素的整数数组,想要求其中索引位置在 a - b 之间所有数字的和,那怎么求呢?一种方式是遍历,从 a 到 b,这样的时间复杂度是 O(n) 级别的;第二种是使用线段树,则可以把时间复杂度优化到 O(logn)。

继续阅读“线段树的 js 实现”

动画展示插入排序全过程

计划把学习的系列排序算法做个简单的动画,坚持做到 timsort 为止。