本文转载自微信公众号《微信大学前端技术》,作者孙凌志。转载本文请联系微一大学前端技术公众号。根据身份证号码计算性别和年龄1.身份证号码国家标准1.适用范围《公民身份号码》(GB11643-1999)本标准规定了公民身份证号码的编码对象、号码结构和表示形式,使每个编码对象得到一个唯一的、不可变的合法编号。2、号码的结构公民身份证号码是一个特征组合码,由一个17位的主体代码和一个校验码组成。从左到右排列顺序为:六位地址码、八位出生日期码、三位顺序码、一位校验码。2.1.地址代码表示编码对象常住地所在县(市、旗、区)的行政区划代码。2.2.出生日期代码表示编码对象出生的年月日。2.3.序号代表同一地址代码所标识的地区范围内,序号分配给同一年月日出生的人,序号的奇数分配给男性,偶数分配给男性分配给女性。2.4.校验码根据前面的17位数字代码和ISO7064:1983.MOD11-2中的校验码计算方法计算确定(1)17位数字体代码加权求和公式:S=Sum(Ai*Wi)编号11010519491231002加权系数7910584216379105842Ai*Wi7905020S=7+9+0+5+0+20+2+9+24+27+7+18+30+5+0+0+4=167(2)计算模数:Y=mod(S,11)Y=167%11=>2(3)通过取模得到对应的校验码对01234取模5678910校验码10X9876543当2的模为2时,校验码为X二、代码实现1、检查ID号是否正确constWEIGHT=[7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2]constMO=[1,0,'X',9,8,7,6,5,4,3,2]functionisRightId(id){constarr=id.split('')constcheckNumber=arr.pop()//去掉校验码并将pop的返回值赋值给checkNumberletsum=0arr.forEach((ele,index)=>{sum+=ele*WEIGHT[index]})constm=sum%11constresult=MO[m]returnresult+''===checkNumber}console.log(isRightId('11010519491231002X'))//trueconsole.log(isRightId('110105194912310029'))//false2、从身份证号计算年龄函数getAge(id){//1、判断身份首先证书号的正确性//2,判断是否存活constyear=id.substr(6,4)constmonth=id.substr(10,2)constday=id.substr(12,2)consttimeBrth=newDate(`${year}/${month}/${day}`).getTime()consttimeNow=newDate().getTime()constlongTime=timeNow-timeBrthconstdays=longTime/(1*24*60*60*1000)letresult=''if(days<31){result=parseInt(days)+'day'}elseif(days<365){result=`${parseInt(days/30)}月${parseInt(days%30)}day`}else{result=`${parseInt(days/365)}年${parseInt(days%365/30)}月${parseInt(days%365%30)}days`}returnresult}console.log(getAge('11010519491231002X'))//71岁8个月16天console.log(getAge('11010520210820002X'))//6天console.log(getAge('11010520210720002X'))//1个月7天3.通过身份证号判断性别函数getSex(id){//1,首先判断身份证号是否正确constsex=id.substr(16,1)returnsex%2?'male':'female'}console.log(getSex('11010519491231002X'))//女console.log(getSex('11010520210820001X'))//男3,其他1.变性手术后,身份证号有没有变?变性人身份证性别变更后,以户籍所在地派出所公示为准,变更身份证号码2.计算年龄前,首先确认自己是否健在。四、参考资料《公民身份号码》(GB11643-1999)动态规划1、定义动态规划(DynamicProgramming,DP)是运筹学的一个分支,是求解决策过程最优化的过程。可以简单理解为对传统递归的优化。在DP的实践中重要的是递归关系和边界条件。2.简单:爬楼梯问题假设你正在爬楼梯。需要走n步才能到达建筑物的顶部。您一次可以爬1或2个台阶。您有多少种不同的方法可以到达建筑物的顶部?请注意,给定的n是一个正整数。输入:2输出:2解释:有两种方式可以爬到楼顶。1.1storder+1storder2.2ndorder示例2:输入:3输出:3解释:有三种方式可以爬到楼顶。1.1st+1storder+1storder2.1storder+2ndorder3.2order+1storder代码://将数据缓存在数组中varclimbStairs=function(n){letdp=[]dp[0]=1;dp[1]=1;for(leti=2;i<=n;i++){dp[i]=dp[i-1]+dp[i-2];}returndp[n];};//使用递归varclimbStairs=函数(n){if(n===1)return1if(n===2)return2returnclimbStairs(n-1)+climbStairs(n-2)};idea:f(x)=f(_x_?1)+f(x_?2)爬到第x步的计划数是爬到第x-1步的计划数与第x步的计划数之和计划爬到x-第二步。LeetCode跑分:3.中等:最长回文子串题目给你一个字符串s,求s中最长的回文子串。示例1:输入:s="babad"输出:"bab"解释:"aba"也是符合问题意思的答案。例2:输入:s="cbbd"输出:"bb"思路:当s[i+1:j-1]为回文,且s的i和j字母相同时,s[i:j]将是一个回文字符串。即:P(i,j)=P(i+1,j?1)和(Si==Sj)。边界条件:子串的长度为1或2。对于长度为1的子串,显然是回文;对于长度为2的子串,只要它的两个字母相同,就是回文。P(i,i)=trueP(i,i+1)=(Si==Si+1)代码:functionlongestPalindrome(s){//先判断字符串的长度,如果为1,直接返回letlen=s。lengthif(len<2)returns//初始化变量letmaxLen=1letbegin=0//dp[i][j]表示s[i..j]是否为回文letdp=[]//初始化:所有长度都是1的substrings都是回文串for(leti=0;i
