如題詳述:
請用您熟悉的編程語言,編程實現(xiàn)一個比較任意兩個軟件版本號大小的函數(shù),如 1.2.3a 和 1.2.4b 比較,后者版本號更大,請考慮各種情況,不可以使用系統(tǒng)提供的比較函數(shù)。
注:請問大家有沒有好的實現(xiàn)方法與思路?
// 這個是小年糕公司的筆試題, 我做了這個題目獲得了面試資格.去公司面試也是筆試,筆試掛掉了。
// 然后到公司是做這3個題目,https://www.cnblogs.com/mingz...
// 不考慮字母
function s2i(s) {
return s.split('').reduce(function(a, c) {
var code = c.charCodeAt(0);
if (48<=code && code < 58) {
a.push(code-48);
}
return a;
}, []).reduce(function(a, c) {
return 10*a + c;
}, 0);
}
function versionCmp(s1, s2) {
var a = s1.split('.').map(function(s) {
return s2i(s);
});
var b = s2.split('.').map(function(s) {
return s2i(s);
});
var n = a.length < b.length ? a.length : b.length;
for (var i = 0; i < n; i++) {
if (a[i] < b[i]) {
return -1;
} else if (a[i] > b[i]) {
return 1;
}
}
if (a.length < b.length) return -1;
if (a.length > b.length) return 1;
var last1 = s1.charCodeAt(s1.length-1) | 0x20,
last2 = s2.charCodeAt(s2.length-1) | 0x20;
return last1 > last2 ? 1 : last1 < last2 ? -1 : 0;
}
安利一個npm包
const semver = require('semver')
semver.valid('1.2.3') // '1.2.3'
semver.valid('a.b.c') // null
semver.clean(' =v1.2.3 ') // '1.2.3'
semver.satisfies('1.2.3', '1.x || >=2.5.0 || 5.0.0 - 7.2.3') // true
semver.gt('1.2.3', '9.8.7') // false
semver.lt('1.2.3', '9.8.7') // true
semver.valid(semver.coerce('v2')) // '2.0.0'
semver.valid(semver.coerce('42.6.7.9.3-alpha')) // '42.6.7'
常見的版本號命名方式,GNU,WINDOWS等,無外乎數(shù)字+字母,數(shù)字可能就是版本的迭代,如:V1.2.3
, 也可能是日期,如V2018-06-25
, 20180625
。還有可能跟上階段命名如 α
β
γ
等。如果你只想比較數(shù)字部分,只需要去掉非數(shù)字部分,比較大小就行。
如果要比較字母部分,那要區(qū)分來看,對a b c這種,直接轉(zhuǎn)成小寫做大小比較就行。對trial, demo, unregistered這些,你要做個字典了。
如js代碼
let version1 = 'v1.2.3a';
let version2 = 'v1.2.4b';
let versionNumber1 = version1.replace(/[a-zA-Z]/g, (match,i)=> match.charCodeAt()).replace(/[^\d]/g, '') - 0;
let versionNumber2 = version2.replace(/[a-zA-Z]/g, (match,i)=> match.charCodeAt()).replace(/[^\d]/g, '') - 0;
console.log(versionNumber1 > versionNumber2);
以上代碼面對 v1.2.97a
和 v1.10.1b
這樣位數(shù)不一樣的版本號可能有問題,特改進下,差異太大的就不行了,比如比較v2021333
,v1.2.3
let version1 = 'v1.2.97a';
let version2 = 'v1.10.1b';
let versionArr1 = version1.replace(/[a-zA-Z]/g, (match,i)=> '.' + match.charCodeAt()).split(/[^\d]/);
let versionArr2 = version2.replace(/[a-zA-Z]/g, (match,i)=> '.' + match.charCodeAt()).split(/[^\d]/);
// 保證兩個數(shù)據(jù)長度一樣,面向 `v1.2` 和 `v1.2.3` 這樣的情況
if(versionArr1.length > versionArr2.length) {
versionArr2.splice(versionArr2.length, 0, ...Array(versionArr1.length-versionArr2.length).fill(0))
} else {
versionArr1.splice(versionArr1.length, 0, ...Array(versionArr2.length-versionArr1.length).fill(0))
}
// 按節(jié)比較
let result = 'version1 equels version2.'
for(let i=0 ; i < versionArr1.length; i ++) {
if (+versionArr1[i] > +versionArr2[i]) {
result = 'version1 is bigger.';
break;
} else if (+versionArr1[i] < +versionArr2[i]){
result = 'version2 is bigger.';
break;
}
}
console.log(result);
function compare(version1,version2){
let arr1 = version1.split('.'); //版本1分割
let arr2 = version2.split('.'); //版本2分割
let [firstFlag,secondFlag,thirdFlag]=[false,false,false]; //定義版本的三個部分大小標(biāo)志
//1.判斷第一位
if( Number.parseInt(arr1[0]) > Number.parseInt(arr2[0]) ){
firstFlag = true;
}
//2.判斷第二位
if( Number.parseInt(arr1[1]) > Number.parseInt(arr2[1]) ){
secondFlag = true;
}
/*3.判斷第三位
1.全部為數(shù)字
2.全部為字母
3.數(shù)字字母混合
*/
//如果數(shù)組中第三個元素經(jīng)過parseInt之后,得到的都不是NaN,說明都為數(shù)字
if( Number(arr1[2]) && Number(arr2[2]) ){
console.log('都為數(shù)字');
thirdFlag = Number.parseInt(arr1[2]) > Number.parseInt(arr2[2]);
//如果parseInt之后都為NaN,說明都是字母
}else if( Number.isNaN(Number.parseInt(arr1[2])) && Number.isNaN(Number.parseInt(arr2[2])) ){
console.log('都為字母');
thirdFlag = arr1[2].charCodeAt() > arr2[2].charCodeAt();
}else{
console.log('字母和數(shù)字混合的');
let num1 = Number.parseInt(arr1[2]);
let num2 = Number.parseInt(arr2[2]);
let word1 = arr1[2].split(num1)[1];
let word2 = arr2[2].split(num2)[1];
if(num1 > num2){
thirdFlag = true;
}else{
thirdFlag = word1.charCodeAt() > word2.charCodeAt();
}
}
return firstFlag || secondFlag || thirdFlag;
}
北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
北大青鳥中博軟件學(xué)院創(chuàng)立于2003年,作為華東區(qū)著名互聯(lián)網(wǎng)學(xué)院和江蘇省首批服務(wù)外包人才培訓(xùn)基地,中博成功培育了近30000名軟件工程師走向高薪崗位,合作企業(yè)超4
中公教育集團創(chuàng)建于1999年,經(jīng)過二十年潛心發(fā)展,已由一家北大畢業(yè)生自主創(chuàng)業(yè)的信息技術(shù)與教育服務(wù)機構(gòu),發(fā)展為教育服務(wù)業(yè)的綜合性企業(yè)集團,成為集合面授教學(xué)培訓(xùn)、網(wǎng)
達內(nèi)教育集團成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機構(gòu),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負責(zé)iOS教學(xué)及管理工作。
浪潮集團項目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗,技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。