复原IP地址
题目描述给定一个只包含数字的字符串,用以表示一个 IP 地址,返回所有可能从 s 获得的 有效 IP 地址 。你可以按任何顺序返回答案。有效 IP 地址正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 '.' 分隔。例如:"0.1.2.201" 和 "192.168.1.1" 是有效 IP 地址,但是 "0.011.255.245"、"192.168.1.312" 和 "192.168@1.1" 是无效 IP 地址。
示例1:
输入:s = "25525511135"输出:["255.255.11.135","255.255.111.35"]
示例2:
输入:s = "0000"输出:["0.0.0.0"]
解题思路定义辅助函数,递归调用辅助函数解决问题。辅助函数接收未处理的字符串以及部分 ip 分组,例如对于一个字符串 &quo ...
记一次 React 中 CSS 处理事件
事件的起因是对一个使用传统网页开发的 Web 项目(即 html, css, javascript 分开写的项目)重构为 React 项目。
这个事情大部分都是复制粘贴,假设有以下的文件目录
Main index.jsx index.module.css
index.module.css 的内容如下所示
.box-left { /* 一些CSS样式 */}
在 Main 组件的 index.jsx 中引入了 index.module.css
import React from 'react'import styles from './index.module.css'function Main() { return ( <div className={styles.boxLeft}></div> )}export default Main
当我绑定类名时,WebStorm 提示我写成 boxLeft,因为 box- ...
反转链表
反转链表题目描述给你单链表的头节点 head,请你反转链表,并返回反转后的链表。
示例:
输入:head = [1,2,3,4,5]输出:[5,4,3,2,1]
解题思路第一种解法,使用递归,分为两步,第一步对后续的链表进行反转,第二步将当前节点添加到已反转列表的最后,如下
反转后续节点的的操作同上,直至剩下最后一个节点,就不必反转了。
因为我们需要将当前节点挂在已反转的节点的最后,所以我们需要知道最后一个节点是什么,通过图可以观察到,已反转链表的最后一个节点是当前节点在未反转链表中的下一个节点。例如当前节点 1,已反转链表的最后一个节点 2 是其在未反转链表中的下一个节点,所以我们在反转后续节点前可以先将此节点保存下来
public ListNode reverseList(ListNode head) { if (head == null || head.next == null) { return head; } ListNode next = head.next; ListNode root = re ...
SpringBoot入门
本篇文章需要有 Spring 的使用经验,在本篇文章中,对于 Spring 的基本概念如 IOC DI AOP 不会进行介绍,以及对于在 Spring 中的常用注解,如 @Component @Autowired @Bean 等等注解默认你已经掌握,否则学习本篇文章会比较困难。
如果使用过 Spring 的话,我们一般要写 xml 配置文件,或者使用 @Configuration 注解来配置 Spring,这个过程非常的惹人讨厌,给我们带来很大的负担,比如对于我来说,Spring 的 xml 配置文件的头部我就记不下来,每次都要从官网复制或者从自己的博客笔记中复制,这种不能完全掌握的感觉我觉得很糟糕。
Spring Boot 的出现,使得我们不需要写这种繁琐的配置文件,它的优点就是约定大于配置,所谓约定,即默认使用大家一致认可的配置,而程序员只需要配置不符合约定部分,所以其实 Spring Boot 可以是零配置的,在下面的入门小节我们将看到不编写任何的配置文件搭建一个 Web 服务。
入门我们在这个小节中快速的搭建一个 Spring Boot 项目,有两种方法
在 Spring 官 ...
小球会停下来吗
在高中的时候我有这么一个思考,灵感源于一道物理题目
一个小球从高度为 $h$ 的地方下落,落在地面上接着弹起,但是由于与地面碰撞造成能量损失,使得每次弹起的高度只有之前高度的 $1/4$。
这道题目看起来是没有什么问题,当时我的想法是每次球的高度都会变为原来的 $1/4$,所以球是会一直这样弹下去的,就像是庄子说的
一尺之棰,日取其半,万世不竭。
所以在这里我得到一个结论,小球会一直运动下去,所以小球的运动时间为无穷大。
但是当我计算时却发现不对劲,假设从高度为 $h$ 降落所需的时间为 $t_0$,由于下降所需时间 $t \propto \sqrt{h}$ ,那么 $h/4$ 下降所需的时间为 $t_0/2$,换句话说,每次上升然后下降所需的时间为之前所需时间的一半,所以耗费的时间的数列为$$t_0, , \frac{t_0}{2}, , \frac{t_0}{2^2}, , \dots, ,\frac{t_0}{2^n}, , \dots$$这是一个等比数列,公比为 $1/2$,我们对这个数列求和$$t_0 \lim_\limits{n \to \infty}\sum_{i ...
两数之和
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案,但是,数组中同一个元素不能使用两遍。
示例:
>给定 nums = [2, 7, 11, 15], target = 9>因为 nums[0] + nums[1] = 2 + 7 = 9>所以返回 [0, 1]
解决该方法最容易的版本是,首先固定一个数 nums[i],然后遍历数组查看是否包含 target-nums[i] 的数字,代码如下:
public int[] twoSum(int[] nums, int target) { int[] res = new int[2]; // 首先固定 nums[i] for (int i = 0; i < nums.length - 1; i++) { // 接着在剩下的数字查找是否有数字等于 target - nums[j] // 或者说 nums[i] + nums[j] = targe ...
Webpack入门
Webpack介绍webpack 是什么,以及它有什么作用,解决了什么问题,这些都是我们需要在学习 webpack 的用法之前需要了解的。
如果你上网去搜的话,一般的介绍是它是一个打包工具,那么什么又叫做打包工具? 由于现在的开发都是多人协作开发,所以一般会将功能分成一个个的模块由不同程序员开发,但是这些模块之间并不是毫无关联的,模块之间会有依赖关系。我们分开为了多个文件,由于依赖关系复杂,如果这些文件加载顺序不当,就有可能发生错误,另外分开成多个文件也意味着有多个网络请求,这会对服务器造成压力,所以我们就有需要将它们合并成一个文件的需要,而将多个文件合成成一个文件,我们就称之为打包。
这里贴一张官网的图片
通过官网的图片可以看出,webpack 可以将依赖的文件打包成单个的资源文件。
但是 webpack 除了打包之外还有什么作用,或者说我们有什么需求需要它帮我们去完成。例如我们希望在项目中使用高级的 JS 语法,比如 ES6 或者更高级的语法,可是浏览器对于 ES6 的支持可能并不完全,但是我们就是想用,这个时候我们就有将 ES6 及更高级的语法转化为 ES5 或更低级语法的需 ...
使用CSS和JavaScript做一个时钟
在 Youtube 看到一个使用 CSS 和 JavaScript 实现的时钟效果,觉得是个比较好的练手项目,就跟着做了一个,在深入研究代码的过程中的确学习到了很多的东西,成品效果如下
首先我们搭建基本的页面结构,新建 clock.html 如下
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" href="clock.css"></head><body> <div id="clock"> <div id="hour"></div> <div id="minute"></div ...
JavaScript加号运算符
今天看到几道有关加号的题目,觉得很怪异如下
[] + {} // '[object Object]'[] + [] // ''{} + [] // 0{} + {} // NaN[] + {} == {} + [] // true{} + [] != [] + {} // true
当时我就完全没有搞懂,所以决定探索一下 JavaScript 中的 + 号运算符,另外,对于 toString 和 valueOf 这两个方法一直搞不清会调用哪个,在探索 + 号运算符的过程中也一并搞懂了,我将会在下面仔细讲解。
一元运算符+ 既可以作为一元运算符,也可以作为二元运算符,首先我们先讲解较简单的一元运算符,如下表:
类型
转换规则
undefiend
NaN
null
0
boolean
true => 1false => 0
number
原样返回,如 +1 ...
股票的最大利润
题目:假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少? 例如,一只股票在某些时间节点的价格为 $[9, 11, 8, 5, 7, 12, 16, 14]$。如果我们能在价格为 $5$ 的时候买入并在价格为 $16$ 时卖出,则能收获最大的利润 $11$。
如果我们使用蛮力法来解决这个问题,在访问数组中的数字时买入,然后寻找后面的最大值卖出,得到买卖的差值,而我们使用变量保存最大的买卖差值,这样的算法的时间复杂度为 $O(n^2)$。
如果我们换一种思路,如果我们以 $diff(i)$ 表示以数组中第 $i$ 数字将股票卖出能够获得的最大利润($i$ 从 $0$ 开始),在卖出的价格一定时,买入的价格越低越好,所以我们只要找出前面 $i-1$ 个数字中的最小值即可得到买卖的最大利润,但是我们不用扫描前面的数字,我们完全可以使用一个变量将前面的最小值记录下来。所以这样做的时间复杂度为 $O(n)$,我们只需要扫描一遍数组即可。
代码如下
public static int maxDiff(int[] data) { if (d ...