All Posts

常用的正则表达式

正则表达式的用处很多,在很多地方都可以用得到,下面介绍一些常用的正则表达式 一、校验数字的表达式 数字:^[0-9]*$ n位的数字:^\d{n}$ 至少n位的数字:^\d{n,}$ m-n位的数字:^\d{m,n}$ 零和非零开头的数字:^(0|[1-9][0-9]*)$ 非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(.[0-9]{1,2})?$ 带1-2位小数的正数或负数:^(-)?\d+(.\d{1,2})?$ 正数、负数、和小数:^(-|+)?\d+(.\d+)?$ 有两位小数的正实数:^[0-9]+(.[0-9]{2})?$ 有1~3位小数的正实数:^[0-9]+(.[0-9]{1,3})?$ 非零的正整数:^[1-9]\d*$ 或 ^([1-9][0-9]){1,3}$ 或 ^+?[1-9][0-9]$ 非零的负整数:^-[1-9][]0-9″$ 或 ^-[1-9]\d$ 非负整数:^\d+$ 或 ^[1-9]\d*|0$ 非正整数:^-[1-9]\d*|0$ 或 ^((-\d+)|(0+))$ 非负浮点数:^\d+(.\d+)?$ 或 ^[1-9]\d*.\d*|0.\d*[1-9]\d*|0?.0+|0$ 非正浮点数:^((-\d+(.\d+)?)|(0+(.0+)?))$ 或 ^(-([1-9]\d*.\d*|0.\d*[1-9]\d*))|0?.0+|0$ 正浮点数:^[1-9]\d*.\d*|0.\d*[1-9]\d*$ 或 ^(([0-9]+.[0-9][1-9][0-9])|([0-9][1-9][0-9].[0-9]+)|([0-9][1-9][0-9]))$ 负浮点数:^-([1-9]\d*.\d*|0.\d*[1-9]\d*)$ 或 ^(-(([0-9]+.[0-9][1-9][0-9])|([0-9][1-9][0-9].[0-9]+)|([0-9][1-9][0-9])))$ 浮点数:^(-?\d+)(.\d+)?$ 或 ^-?([1-9]\d*.\d*|0.\d*[1-9]\d*|0?.0+|0)$ 二、校验字符的表达式 汉字:^[\u4e00-\u9fa5]{0,}$ 英文和数字:^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$ 长度为3-20的所有字符:^.{3,20}$ 由26个英文字母组成的字符串:^[A-Za-z]+$ 由26个大写英文字母组成的字符串:^[A-Z]+$ 由26个小写英文字母组成的字符串:^[a-z]+$ 由数字和26个英文字母组成的字符串:^[A-Za-z0-9]+$ 由数字、26个英文字母或者下划线组成的字符串:^\w+$ 或 ^\w{3,20}$ 中文、英文、数字包括下划线:^[\u4E00-\u9FA5A-Za-z0-9_]+$ 中文、英文、数字但不包括下划线等符号:^[\u4E00-\u9FA5A-Za-z0-9]+$ 或 ^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$ 可以输入含有^%&’,;=?$\”等字符:[^%&’,;=?$\x22]+ 禁止输入含有的字符:[^\x22]+ 三、特殊需求表达式 Email地址:^\w+([-+.]\w+)@\w+([-.]\w+).\w+([-.]\w+)*$ 域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.? InternetURL:[a-zA-z]+://[^\s]* 或 ^http://([\w-]+.)+[\w-]+(/[\w-./?%&=]*)?$ 手机号码:^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$ 电话号码(“XXX-XXXXXXX”、”XXXX-XXXXXXXX”、”XXX-XXXXXXX”、”XXX-XXXXXXXX”、”XXXXXXX”和”XXXXXXXX):^($$\d{3,4}-)|\d{3.4}-)?\d{7,8}$ 国内电话号码(0511-4405222、021-87888822):\d{3}-\d{8}|\d{4}-\d{7} 身份证号(15位、18位数字):^\d{15}|\d{18}$

latex如何给表格添加注释

在latex中,想给表格添加注释,可以使用threeparttable这个包 代码如下: \usepackage{threeparttable} \begin{table*} \begin{threeparttable} \centering \caption{Statistical results of the IGD values of the final populations obtained by RM-MEDA and RM-MEDA-II on the 10 test instances over 30 runs.} \label{TAB1} \begin{tabular}{l|cccc|cccc}\hline\hline instance&\multicolumn{4}{c}{RM-MEDA}&\multicolumn{4}{|c}{RM-MEDA-II}\\ &mean&std.&best&worst&mean&std.&best&worst\\\hline $F_{1}$ &$3.90e-03$ &$1.39e-04$ &$3.70e-03$ &$4.20e-03$ &$\textbf{3.60e-03}$ &$1.02e-04$ &$3.40e-03$ &$3.80e-03$\\\\ $F_{2}$ &$3.80e-03$ &$1.43e-04$ &$3.50e-03$ &$4.10e-03$ &$\textbf{3.70e-03}$ &$9.83e-05$ &$3.50e-03$ &$3.90e-03$\\\\ $F_{3}$ &$7.20e-03$ &$3.90e-03$ &$3.60e-03$ &$1.55e-02$ &$\textbf{6.70e-03}$ &$1.10e-03$ &$3.80e-03$ &$8.50e-03$\\\\ $F_{4}$ &$5.03e-02$ &$1.30e-03$ &$4.82e-02$ &$5.35e-02$ &$\textbf{5.08e-02}$ &$2.10e-03$ &$4.81e-02$ &$5.62e-02$\\\\ $F_{5}$ &$5.30e-03$ &$3.00e-03$ &$4.40e-03$ &$2.12e-02$ &$\textbf{4.50e-03}$ &$1.53e-04$ &$4.20e-03$ &$4.80e-03$\\\\ $F_{6}$ &$8.30e-03$ &$2.10e-03$ &$5.70e-03$ &$1.50e-02$ &$1.62e-02$ &$2.30e-02$ &$5.40e-03$ &$1.20e-01$\\\\ $F_{7}$ &$1.60e-01$ &$2.35e-01$ &$7.96e-02$ &$1.03e+0$ &$1.76e-01$ &$2.33e-01$ &$3.28e-02$ &$1.02e+0$\\\\ $F_{8}$ &$6.59e-02$ &$3.50e-03$ &$6.05e-02$ &$7.69e-02$ &$\textbf{6.37e-02}$ &$3.60e-03$ &$5.81e-02$ &$7.65e-02$\\\\ $F_{9}$ &$8.00e-03$ &$2.80e-03$ &$5.80e-03$ &$1.48e-02$ &$\textbf{7.70e-03}$ &$3.20e-03$ &$5.40e-03$ &$2.24e-02$\\\\ $F_{10}$ &$1.25e+02$ &$2.35e+01$ &$2.27e+01$ &$1.44e+02$ &$\textbf{2.36e+02}$ &$3.48e+01$ &$5.02e+0$ &$1.38e+02$\\ \hline\hline \end{tabular} \begin{tablenotes} \item[1] The bolder ones mean better. \end{tablenotes} \end{threeparttable} \end{table*}

从后台看python--为什么说python是慢的

python越来越作为一种科学技术研究的语言越来越流行,可是我们经常听到一个问题,python是慢的。那么我们从后台分析一下,为什么python是慢的。 python是一种动态类型,解释型语言,它的值都是存储在分散的对象中,而不是紧密的缓存之中。 1.python是动态类型语言 这意味着编译器在程序执行之前并不知道变量定义的类型。C定义变量和Python定义变量的方式的区别: 对于C,编译器通过定义知道变量的类型;然而对于python中的变量,当你知道变量的类型的时候已经是程序执行的时候了。 我们分析一小段代码分别在python和C中执行的具体区别: 在C中,如果你写如下代码: int a = 1; int b = 2; int c = a + b; 1.分配一个类型1给a 2.分配一个类型2给b 3.调用一个二进制加法<int,int>(a,b) 4.将结果分配给c 在python中,同样的 a = 1 b = 2 c = a + b 1.分配1给a 设置一个对象,然后将它的类型设置为整数 将它的值设为1 2.分配2给b 设置一个对象,然后将它的类型设置为整数 将它的值设为2 3.调用一个二进制加法(a,b) 寻找一个类型在对象中 a是一个整数,它的值是a 寻找一个类型在对象中 b是一个整数,它的值是b 调用一个二进制加法 返回结果,结果是一个整数 4.产生一个对象c 将一个对象的类型设置为整数 将它的值分配给结果 动态类型意味着每一步操作需要更多的步骤。python比c慢的一个基本的原因就是数字计算上面的操作。 2.python是一种解释型的语言而不是编译型的 我们可以看到解释型语言和编译型语言的区别。一个聪明的编译器知道怎么提前优化,避免重复和不必要的操作,从而提高效率。当然,在这一点上也是仁者见仁智者见智。 3.python的对象模型导致存储效率低下 python存储数据效率低下的原因,主要可以从下图看出: 当然说了python这么多缺点,为什么python用的人还这么多,因为它很简单啊。python用起来的确很简单,就我个人的使用感受而言,除了matlab,我没有看过比python还要简单的语言了。而且python的开源的库很多,所以做很多东西都很方便。

谈谈CS英文论文写作

作为一个CS的研究生,发篇文章是你毕业的必要条件。现如今,学校对于文章的要求也越来越高,一般来说,还是国外的期刊或者会议更加受到认可,这样对于毕业也有好处。因此,以我自己的感受来说,论文的写作以及表达方式,合理地呈现你的实验结果,清楚的逻辑解释,显得尤为重要。让人看得懂的论文往往比一个拥有的好的想法的论文更能得到别人的认可,当然这也并不是推崇只是为了专注于论文的写作,毕竟想法才是一篇论文的灵魂。然而事实如此,做好论文的写作的重要性实在很大。 作为一个研究生,很显然并没有很多的论文的写作经验。所以,我们一般的做法就是模仿别人的论文写作。我们需要阅读大量别人的论文,这样其实也是对自己的语感的培养。当然,这里推荐你还是多读读外国人写的论文,因为他们的论文写作表达方式相对来说更为的地道。我觉得论文写作的词汇使用很讲究的,同一种意思可以有很多种表达方式。就比如说你的算法很好,你可以说:outperforms than other algorithm, has advantages over other algorithm, has impressive performances, has remarkable performances等等。我前段时间,看到有个单词就很好,circumvent,这个单词的意思是绕开。其实,我们算法的改进,很多时候并不是对这个问题的直接改进,而是绕开这个问题,从而避免这个问题,所以我就觉得这个单词用的很精妙。 其实现在的论文写作也和古代的八股文一样,有一样的套路。其实对于一个给定方向的论文,他们的套路其实基本都是一致的。老实说,对于所有的论文我们基本都有一个一致的框架结构。首先,一般在abstract里面,我们会简要的说一下我们的思想,这里要言简意赅,并且能够最大化吸引别人,突出你想发的优点。然后,在introduction里面,就是介绍相关背景知识的时候,像我们专业,一般都是介绍一些相关的算法,或者你提出的算法的基础,这些都是我们提出的算法基础。接着才是提出我们自己的算法的正确的时机。在正文里面,首先就是介绍你算法或者思想的基础,然后就是你的算法和思想了。记住,这个才是你论文的核心部分。你的论文大部分应该都是讲你自己的想法而不是别人的想法,否则也就是本末倒置了。计算机的论文,很多都是需要实验结果来佐证的。没有实验结果,你的所有想法都不具有说服力。同时,实验结果需要相应的详细的分析过程,对于实验结果你要分析的多一点,虽然觉得有时候觉得自己说的是废话,但也尽量多说一点,多换点角度表达。一般你可以从性能上去说,说我们算法的性能好;如果算法的性能差不多,那就可以从运行时间去说,可以说我们算法的运行速度快。当然,我觉得写别的方向的论文应该也是差不多的,从多个角度去表现你算法和想法的优点,这一点很有必要。另外一点,多用图和表格来表达你的实验结果,图优于表格,表格优于文字,文字最次。优秀的表达方式往往更容易吸引别人的目光,所以多学一下怎么画图。看一些TOP期刊的文章,他们是怎么画图的,这样装逼也会好一点。 其他的我也不知道还有什么好说的把。自己真心的体会,是中国人真的灌了好多水,尤其是我自己的这个方向。有时候自己也觉得很愤慨,但想想自己,何曾不是也在灌水。可能还是自己也是推动这个方向恶性循环的一份子,还是希望以后这个方向有更良性的发展吧,当然,与我无关了。

剑指offer--字符串

C/C++中每个字符串都以字符’\0’作为结尾,这样我们就可以很方便的找到字符串最后的尾部。由于这个特点,每个字符串中都有一个额外字符的开销,稍不留神就会造成字符串的越界。 为了节省内存,C/C++把常量字符串放到单独的一个内存取余。当几个指针赋值给相同的常量字符串时,它们实际上会指向相同的内存地址。 int main() { char str1[] = "hello world"; char str2[] = "hello world"; char* str3 = "hello world"; char* str4 = "hello world"; if(str1 == str2) printf("str1 and str2 are same.\n"); else printf("str1 and str2 are not same.\n"); if(str3 == str4) printf("str3 and str4 are same.\n"); else printf("str3 and str4 are not same.\n"); return 0; } str1和str2是两个字符串数组,我们会为它们分配两个长度为12个字节的空间,并把"hello world"的内容复制上去。这是两个初始地址不同的数组,因此str1和str2的值也不相同。 str3和str4是两个指针,我们无须为它们分配内存以存储字符串的内容,而只需要把它们指向"hello world"在内存中的地址就可以了。由于"hello world"是常量字符串,它在内存中只有一个拷贝,因此str3和str4指向的是同一个地址。 在C#中,封装字符串的类型System.String有一个非常特殊的性质:String中的内容是不能改变的。一旦试图改变String的内容,就会产生一个新的实例。 String str = "hello"; str.ToUpper(); str.Inser(0,"world"); 虽然我们对str做了ToUpper和Insert两个操作,但操作的结果都是生一个新的String实例并在返回值中返回,str本身的内容都不会发生改变,因此str最终的内容不变。由此可见,试图多次改变String的内容,改变之后的值只可以通过返回值得到。用String做连续多次修改,每一次修改都会产生一个临时对象,这样开销太大。为此C#定义一个新的与字符串相关的类型StringBuilder,它能容纳修改后的结果。

剑指offer学习读书笔记--二维数组中的查找

在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都是按照从上到下递增的顺序排序。请设计一个函数,输入这样的一个二维数组和一个整数,判断数组是否含有这个整数。 1 2 8 9 2 4 9 12 4 7 10 13 6 8 11 15 我们可以发现以下规律:首先选取数组右上角的数字。如果这个数字是要寻找的数字,则返回结果。若这个数字大于我们要寻找的数字,则去除这个数字所在的列;若这个数字小于我们要寻找的数字,则去除这个数字所在的行。也就是说如果查找的数字不在数组的右上角,则每一次都在数组查找范围中剔除一行或者一列,这样每一步都可以缩小查找的范围了,直到找到需要查找的数字或者查找的范围为空。 从另外一个角度看,从左下角的数字来看,如果这个数字大于查找的数字,则剔除该行,若这个数字小于查找的数字,则剔除该列。 bool Find(int* matrix,int rows,int cols,int num) { bool found = false; if (matrix != null && rows > 0 && cols > 0) { int row = 0; int col = cols - 1; while(row < rows && col >= 0) { if (matrix[row*cols + col] == num) { found = true; break; } else if(matrix[row*cols + col] > num) -- col; else ++ row; } } return found; }

剑指offer学习--实现单例模式

只能生成一个实例的类是为了实现单例模式的类型。 加同步锁前后两次判断实例是否已存在 我们只是在实例还没有创建之前加锁操作,以保证只有一个线程创建出实例。而当实例已经创建之后,我们已经不需要再做加锁操作了。 public sealed class Singleton { private Singelton() { } private static object syncObj = new object(); private static Singleton instance = null; public static Singleton Instance { get { if (instance == null) { locak(syncObj) { if (instance == null) instance = new Singleton(); } } return instance; } } } 利用静态构造函数 public seled class Singleton { private Singelton() { } private static Singleton instance = new Singleton(); public static Singleton Instance { get { return instance; } } } 由于C#中调用静态构造函数时初始化静态变量,.NET运行时能够保证只调用一次静态构造函数,这样我们就能够保证只初始化一次instance。C#中调用静态构造函数的时机不是由程序员掌控的,而是当.NET运行时发现第一使用一个类型的时候自动调用该类型的静态构造函数。在Singleton中,实例instance并不是第一次调用属性Singleton.Instance的时候创建的,而是在第一次用到Singleton的时候就会被创建。

latex算法步骤如何去掉序号

想去掉latex算法步骤前面的序号,如下 我想去掉每个算法步骤前面的数字序号,1,2,3,因为我已经写了step。我们只需要引用a lgorithmic这个包就可以了,代码如下: \usepackage{algorithmic} \begin{algorithm}[htb] \caption{SDE} \label{alg2} \begin{algorithmic} \STATE Step 1. Compute the covariance matrix $C$ of the current population, then apply Eigen decomposition to $C$ as follows: \begin{equation} \label{eve} C=EDE^T \end{equation} where $E$ is the eigenvector matrix of the population, $E^T$ is the corresponding transposed matrix. $D$ is a diagonal matrix composed of eigenvalues. \STATE Step 2. Compute the the projection of the population with eigenvector matrix $E$. \begin{equation} \label{proj} P=X_G\cdot{E} \end{equation} \STATE Step 3. Operate the mutation in Eigen coordinate sysytem. \begin{equation} \label{mut} P'=P_{r_1}+F\cdot(P_{r_2}-P_{r_3}) \end{equation} where $P_{r_1}$, $P_{r_2}$ and $P_{r_3}$ are sampled randomly from the projection $P$, $P'$ is the projection of mutation vector. \STATE Step 4. Transform $P'$ to original coordinate system to obtain next generation of population $X_{G+1}$. \begin{equation}\label{org} X_{G+1}=P'\cdot{E^T} \end{equation} \end{algorithmic} \end{algorithm} ok,搞定

前端面试基础题目

行内元素有哪些?块级元素有哪些?CSS的盒模型? 行内元素:a b br i span input select 块级元素:div p h1 h2 h3 h4 form ul css盒模型:content border margin padding 前端页面由哪三层构成,分别是什么,作用是什么? 结构层:主要指DOM节点:HTML/XHTML 样式层:主要指页面渲染:CSS 脚本层:主要指页面动画效果:JS/AS CSS引入的方式有哪些?link和@import的区别是? 内联 内嵌 外链 导入 区别:同时加载 css选择符号有哪些 标签选择符 类选择符 ID选择符 标签上title和alt属性的区别是什么? alt当图片不显示用文字代表 title为该属性提供信息 什么是语义话的HTML? 直观的认识标签,对于搜索引擎抓取有好处 清除浮动的几种方式以及优缺点: 1 使用空标签清除浮动 clear:both(理论上可以清楚任何标签,缺点增加无意义的标签) 2 使用overflow:auto 3 使用afert伪元素清除浮动 IE和标准下有哪些兼容性的写法 var ev = ev || window.event document.documentElement.clientWidth || document.body.clientWidth var target = ev.srcElement || ev.target 闭包就是能够读取其他函数内部变量的函数 添加,插入,替换,删除,到某个节点的方法 obj.appendChildl() obj.innersetBefore() obj.replaceChild obj.removeChild

每日一练--直接插入排序

现在找工作的压力这么大,为了以后好找工作,现在开始要多看看算法,所以以后可以每天做个小题目,练习一下。今天作为第一天,说个最简单的直接插入排序。 直接插入排序可以这么理解,把A[j]和A[0]….A[j-1]的数进行比较,如果比他们小,就插入到比它小的前一位,直接插入排序的时间复杂度是O(n^2). 先给出伪代码分析 //the index of array is from 0 for j=1 to num.length key = num[j]; i = j-1; while i >= 0 and num[i] > key { num[i+1] = num[i]; i--; } num[i+1] = key; 下面用c++来实现 // insertsort.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include<iostream> #include<stdlib.h> using namespace std; int main() { int num[10] = {10,20,1,78,34,99,12,21,2,55}; int key; cout << "the number has not been sorted:" << endl; for (int i = 0;i < 10;i++) { cout << num[i] << ' '; } cout << endl; cout << "the number has been sorted:" << endl; for (int j =1;j <10;j++) { int key = num[j]; int i = j-1; while(i >=0&&num[i]>key) { num[i+1] = num[i]; i--; } num[i+1] = key; } for (int m = 0;m < 10;m++) { cout << num[m] << ' '; } cout << endl; return 0; } 今天一练,到此结束。