做了一份前端面試題,有兩道沒寫出標準答案 ?

.

題目見圖片

其中第二題和最後一題沒有做出標準答案,

第二題是因為「零」是一個特殊值,比如10000,應該顯示一萬,

而不是一萬零千零百零十零,但10001就得顯示成一萬零一

題目中20876 ,我顯示成了二萬零千八百七十六,應該是錯了。。。

最後一題我顯示成了53132,而不是53312,因為沒想到辦法讓3排在31前邊

求高人指點

希望大家用JS寫,(我是前端)

at一下賀老吧,希望能幫忙


第一題

寫的有點亂,這只是一個思路,用正則應該也能實現。

function convert(i) {
var r, n, x = 0, zero = i % 10 === 0;
var unit = [,,十,百,千,萬];
var n2c = [零,一,二,三,四,五,六,七,八,九];
while (i &> 0) {
x++;
n = i % 10;
i = ~~(i /= 10);
if (n === 0 i % 10 === 0) continue;
r = (r ? n2c[n] + (n ? unit[x] : ) + r : n2c[n]);
}
return zero ? r.substr(0, r.length - 1) : r;
}

----------------------------------------

第二題

最簡單的方法應該是這樣的:

function f(i) {
return +(i.sort(compare).join())
}

function compare(a, b) {
var as = a+, bs = b+;
return (bs + as) - (as + bs);
}

原來寫的遞歸的方法:

function f(i) {
return +(i.sort(compare).join())
}

function compare(a, b) {
if (m(a, 1) === m(b, 1))
return recursion(a, b, 2, Math.max((a+).length, (b+).length));
return m(b, 1) - m(a, 1);
}

function recursion(a, b, x, md) {
if (m(a, x) != m(b, x)) return m(b, x) - m(a, x);
else if (x &> md) return a - b;
return recursion(a, b, x + 1, md);
}

// Returns the xth digit of n from left side

function m(n, x) {
var t = (n+).length - x;
return (t &> 0 ? ~~(n / Math.pow(10, t)) : n) % 10;
}

----------------------------------------

小技巧

求整數位數時

(a+).length 比 String(a).length 和 Math.floor(Math.log10(a))+1 都要快

小數取整時

~~a 比 a|0 和 Math.floor(a) 及 ParseInt(a) 都要快


就先解一下第二題,用了一個sort。

function maximum(arr) {
return arr.sort(sortAB).join();
}

function sortAB(a, b) {
var aArr = a.toString().split();
var bArr = b.toString().split();
var aLen = aArr.length;
var bLen = bArr.length;
var aMax = Math.max.apply(Math, aArr);
var bMax = Math.max.apply(Math, bArr);
if (aLen === 1 bLen === 1) {
return bMax - aMax;
} else if (aLen === bLen) {
return b - a;
} else if ((aLen === 1 || bLen === 1) aMax === bMax) {
return aLen - bLen;
} else {
return aLen &> bLen ? function() {
b = fixZero(aLen - bLen, b);
return a == b ? aLen - bLen : b - a;
}() : function() {
a = fixZero(bLen - aLen, a);
return a == b ? aLen - bLen : b - a;
}();
}
}

function fixZero(size, n) {
for (var i = 0; i &< size; i++) { n += 0; } return n; } console.log(maximum([100, 10])); console.log(maximum([100, 1, 9, 1090, 10, 3010, 40])); //9,40,3010,1090,1,10,100 console.log(maximum([19, 62])); console.log(maximum([89, 654])); console.log(maximum([16, 42])); console.log(maximum([17, 187])); console.log(maximum([13, 19, 6, 98, 62, 1])); //9866219131 console.log(maximum([16, 89, 7, 32, 654, 42])); //897654423216 console.log(maximum([4, 5, 7, 9, 9, 2])); // 997542 console.log(maximum([4, 5, 7, 9, 90, 2])); //9907542

具體到就是sort的2個值如何判定,一位數,直接比大小,位數相同直接比大小,有一個個位數,最大數相同的,個位數排前面,其餘情況缺的位數補零,如果相等,位數小的排前面,不相等再直接比大小。

因為是用sort感覺效率應該還好,瓶頸應該在fixZero和split的調用上,去除極值情況應該還好。。感覺我的邏輯比較直白……


你這個........照下來了是一個問題,還放到網上,,被嚴肅點的公司知道了你會被告的哦。


第一題,你們讀一下題!兩萬不是二萬,這裡還要改寫!

var unit = [,十,百,千,萬];
var n2c = [零,一,二,三,四,五,六,七,八,九];

function convert(i) {
return i.toString().split().reverse().map(function(value, key){
return n2c[value] + unit[key]
}).reverse().join().replace(/(零.)+/g,零).replace(/^零|零+$/,).replace(/二(?=[萬千])/g,兩).replace(/^一十/g,十)
}

第二題我想不到比 @Vkki更好的辦法了


第一題

function h(n){

if(n&<1) return;

return n==1? 10 : h(--n)+2;

}

// 20876 =&> 兩萬零八百六十七

第二題 function convert(n){

var arr=[零,一,二,三,四,五,六,七,八,九,十,百,千,萬];

var str=;

while(n){

var l=String(n).length;

var bit=Math.pow(10,l-1);

str+=arr[Math.floor(n/bit)];

n=n%bit;

switch(l){

case 5:str+=arr[arr.length-1];break;

case 4:str+=arr[arr.length-2];break;

case 3:str+=arr[arr.length-3];break;

case 2:str+=arr[arr.length-4];break;

};

(l-String(n).length&>1 ) n!=0 str+=arr[0];

}

return str;

}

最後一題

function sort(arr){

arr.sort(compare);

var str=;

for(var i=0;i& str+=arr[i];

}

return +str;

}

function compare(a,b){

var l=a*Math.pow(10,(b+).length)+b-(b*Math.pow(10,(a+).length)+a);

return l&>0 ? -1 :(!!l);

}


轉換日期:

return時不厚道地hack了一下,但測了一下沒什麼問題

var a=(function(){
var map=零一二三四五六七八九;
var bitName=[,十,百,千,萬,十];
return function(rnum){
num=rnum.toString().split();
var str=,i=0;
while(num.length){
var cur=num.pop();
str=map[cur]+(cur!=0?bitName[i]:)+str;
i++;
}
return str.replace(/零+/g,零).replace(/零$/,).replace(/^一十/,十);
}
})();

一會看看另一道...

_____________

唔。。這個,其實沒有樓上想的那麼複雜。。做一個排序,只要排序後數字比排序前大,那麼就交換,否則就不交換。。

var b=function(arr){
for(var m=0,len=arr.length;m&arr.join()){
arr=tarr;
}
}
}
return arr.join();
}

當然,性能肯定很渣了...___________________________

唔。。貌似第一題擴展一下可以搞定好大位的數。。

var bitName=[,十,百,千,萬,十,百,千,億,十,百,千,兆];

然後


貼一個javaScript版的第一題,

function numToChinese(num){
var numC = [零,一,二,三,四,五,六,七,八,九];
var unit = [,十,百,千,萬];

var str = num + ;
var arr =[]
for(var i=0;i&


貼一個我寫的數字轉漢字的 JS 程序吧:

const convert = num =&> {
const zero = 零;
const units = [, 十, 百, 千, 萬];
const digits = ( + num).split().map(e =&> {
return 零一二三四五六七八九[e];
});

if (digits.length &> 5) {
throw new Error(Unsupported argument.);
}

const next = new Array(digits.length);
let p = -1;
for (let i = digits.length - 1; i &>= 0; i--) {
next[i] = p;
if (digits[i] !== zero) {
p = i;
}
}

let str = ;

for (i = 0; i &< digits.length i !== -1;) { str += digits[i] + units[digits.length - 1 - i]; const next_p = next[i]; if (next_p !== i + 1 next_p !== -1) { str += zero; } i = next_p; } return str.replace(/^一十/, 十); // hack fix. } require(repl).start(&> ).context.convert = convert;

直接丟到 node 里就能運行,題目說僅支持到五位,所以五位以上的數字我就直接拋異常了。

思路就是用字元串來解決。這裡我用一個 next 數組來存儲下一個不為零的位的下標,按這個 next 調整 for 的游標,就能巧妙地過掉所有中間的零,同時判斷如果下標不連續,就填零補位。

最後,一個 hack,把 「一十三」 這類結果轉換成符合漢字 「十三」 這樣的標準表示。

補個圖:


補充一個第二題答案,用了正則表達式去掉重複的零

PS:電腦上做的,調試了幾次,最討厭手寫代碼了,遇到這種題簡直秒跪。

function getHan(num) {
var unitHan = [, 十, 百, 千, 萬],
numHan = [零, 一, 二, 三, 四, 五, 六, 七, 八, 九],
LING = 零;

num = num + "";
var len = num.length, str = ;

for (var i = len - 1; i &>= 0; i--) {

var j = len - i - 1,
singleNum = num.charAt(j);

var singleUnit = unitHan[i];

if (singleNum === 0) {

singleUnit = LING;
}

str += singleNum == 0 ? LING : (numHan[singleNum] + singleUnit);
}

return str
.replace(/零+$|^零+/, )
.replace(/零+/g, LING);
}


第二題

整個哈西影射一到十數字與漢字

數字到串到數組

先把數字換成字

倒循環插十百千萬,如果為零,則不插

最後一題同理

把單個數字轉成串再到數組

然後整個數組concat一下,

然後排下序


//不請自答。 見諒

//遞歸題
(function(){
"use strict";

var get_the_people_age = function(start_age, number){
return number === 1 ? start_age : get_the_people_age(start_age, --number) + 2;
};

console.assert(get_the_people_age(10, 3) === 14, no ok);
console.assert(get_the_people_age(10, 8) === 24, no ok);

})();

//number ---&> chinese
(function(){
"use strict";

var number_chinese = 零一二三四五六七八九十,
unit = 萬千百十;

var number = 20984;

var str = number.split().reduceRight(function(desc, current, index){
return number_chinese.charAt(current) + (current === 0 ? : unit.charAt(index)) + desc;
}, );

console.log(str);

})();


最後一題其實一個排序題,只是要我們自己定義排序規則,這個規則怎麼定呢?考慮數組中任意兩個元素a,b(a,b位數可以為多位),我們要確定的是a還是b放在前面,這個可以轉化為它們組成的數字ab大還是ba大,所以我們可以通過重寫這個規則對list中所有元素排序,排完序之後就可以得到結果。排序你可以直接重寫原來的sort函數,也可以完全自己寫,用快排,歸併什麼的都可以。


雖然只在大學裡上過C課程,我試著給一下最大數那題的思路。

因為無論怎麼排列list中的各個數,最後得出的數的位數是一樣的,所以,我們要找到list 中首位數字最大的數,排在最前面。

比如〈5,3,31,2〉中,四個數的首位數字分別是5,3,3,1,因此,5排在最前。

排在第二位的是首位數字次大的,即3和31。最後排2。

區分3和31,即首位數字相同時。

比較他們的次位數字,大的排前邊;次位如同比較第三位數字。如果一個數位數多於另一個,則比較數位少的數的首位數字和數位多的數的恰好多出那一位的數字之大小,大的排前邊。

比如5263和52,即比較6和5的大小。


最後一道題產生一個方法:

接受一個數組組

把每個數分成數組

從第一位開始比較

如果產生前面相同單長度不同的,將長數組的下一位與所有未排序數組的第一位比較

大的輸出,然後去掉這個數組

將剩下的數組繼續用該方法調用


第二題我的思路是這樣的:對比數組內的每個數字,具體比對思路是先第一位一直對比,相等比第二位,依次類推,最終排出一個數組在用格式轉換成最終結果。

function sortTowNumber(a, b){
var result = 1;
var aA = a.toString().split();
var bA = b.toString().split();
var aLen = aA.length,
bLen = bA.length;
var len = 0;
aLen &>= bLen ? len = aLen : len = bLen;
for (var i = 0; i &< len; i++) { if(aA[i] &> bA[i]){
result = 1;
break;
}else if(aA[i] &< bA[i]){ result = -1; break; } }; return -result; } var arr = [5, 3, 31, 2]; console.log(arr.sort(sortTowNumber).join()*1);//53312 arr = [5, 305, 31, 2]; console.log(arr.sort(sortTowNumber).join()*1);//5313052


function convert(n) {
var unit = ["", 十, 百, 千, 萬];
var num = [零, 一, 二, 三, 四, 五, 六, 七, 八, 九];
var arr = []
var len = (n+"").length
var word = -1;
var last = 0;
for(var i =0;i&< len;i++){ last = n%10 n = ~~(n/10) word++; if(last==0)unit[word] = ""; arr.unshift(num[last]+unit[word]) } for(var i=0;i&


分頁阅读: 1 2