最近去面試,遇到很多算法類的題目,看的是一臉懵,故特此記錄下了此份試題,慢慢去研究里面的問題。
1 一個整數,大於0,不用循環和本地變量,按照n,2n,4n,8n的順序遞增,當值大於5000時,把值按照指定順序輸出來。
例:n=1237
則輸出為:1237,2474,4948,9896,9896,4948,2474,1237
ps.暫時沒找到不用循環的js寫法
function multiple(n){
var mult = Math.floor(5000/n),
arr = [],
arr1 = [],
num;
for(var i=0;i<mult;i++){
num = Math.pow(2,i)*n;
arr.push(num);
}
var arr1 = arr.slice().reverse()
//arr1 = [...arr].reverse();
//var arr1 = [].concat(arr).reverse()
//var arr1 = Object.assign([],arr).reverse()
return arr.concat(arr1);
}
2 將一個鍵盤輸入的數字轉化成中文輸出,例如,輸入1234567 則輸出一百二十三萬四千五百六十七
var _change = {
ary0:["零", "一", "二", "三", "四", "五", "六", "七", "八", "九"],
ary1:["", "十", "百", "千"],
ary2:["", "萬", "億", "兆"],
init:function (name) {
this.name = name;
},
strrev:function () {
var ary = []
for (var i = this.name.length; i >= 0; i--) {
ary.push(this.name[i])
}
return ary.join("");
}, //倒轉字符串。
pri_ary:function () {
var $this = this;
var ary = this.strrev();
var zero = "";
var newary = "";
var i4 = -1;
for (var i = 0; i < ary.length; i++) {
if (i % 4 == 0) { //首先判斷萬級單位,每隔四個字符就讓萬級單位數組索引號遞增
i4++;
newary = this.ary2[i4] + newary; //將萬級單位存入該字符的讀法中去,它肯定是放在當前字符讀法的末尾,所以首先將它疊加入$r中,
zero = ""; //在萬級單位位置的“0”肯定是不用的讀的,所以設置零的讀法為空
}
//關於0的處理與判斷。
if (ary[i] == '0') { //如果讀出的字符是“0”,執行如下判斷這個“0”是否讀作“零”
switch (i % 4) {
case 0:
break;
//如果位置索引能被4整除,表示它所處位置是萬級單位位置,這個位置的0的讀法在前面就已經設置好了,所以這里直接跳過
case 1:
case 2:
case 3:
if (ary[i - 1] != '0') {
zero = "零";
} ; //如果不被4整除,那么都執行這段判斷代碼:如果它的下一位數字(針對當前字符串來說是上一個字符,因為之前執行了反轉)也是0,那么跳過,否則讀作“零”
break;
}
newary = zero + newary;
zero = '';
}
else { //如果不是“0”
newary = this.ary0[parseInt(ary[i])] + this.ary1[i % 4] + newary; //就將該當字符轉換成數值型,並作為數組ary0的索引號,以得到與之對應的中文讀法,其后再跟上它的的一級單位(空、十、百還是千)最后再加上前面已存入的讀法內容。
}
}
if (newary.indexOf("零") == 0) {
newary = newary.substr(1);
}//處理前面的0
return newary;
}
}
//創建class類
function change() {
this.init.apply(this, arguments);
}
change.prototype = _change;
//創建實例
var k = new change("00102040");
alert(k.pri_ary());
3 至少寫出一種排序算法
冒泡算法
function bubbleSort(arr){
var len = arr.length;
for(var i=0; i<len; i++){ //總共需要比較的輪數
for(var j=0; j<len-1-i; j++){ // 每一輪需要進行比較的數字
if( arr[j]<arr[j+1]){ // 相鄰元素相比,小的移至到右邊
var temp = arr[j+1];
arr[j+1] = arr[j];
arr[j] = temp;
}
}
}
return arr;
}
4 盤算102-200之間有多少個素數,並輸出所有素數
var i,j,m;
var k=0;
for (i=100;i<=200;i++){
for(m=1,j=2;j< i;j++)
if(i%j==0) {
m=0;
break;
}
if(m==1){
k++;
console.log (i);
console.log (k);
}
}
5 給定一個字符串,輸出本字符串中只出現一次並且最靠前的那個的位置?
function unique(str){
var arr = str.split(""),
arr1=[],
arr2=[],
temp={},
len = arr.length;
for(var i=0;i<len;i++){
if(!temp[arr[i]]){
temp[arr[i]]= 'abc';
arr1.push(arr[i]);
}else{
arr2.push(arr[i]);
}
}
var len1 = arr1.length,
len2 = arr2.length;
for(var j=0;j<len1;j++){
if(arr2.indexOf(arr1[j])<0){
var chart = arr1[j];
break;
}
}
var index = arr.indexOf(chart);
return index+1;
}
例如:ahhhdjnikkjhasc 則是d,輸出5
6 寫一個函數,找出一個整數數組中,第二大的數
function bubbleSort(arr){
var len = arr.length;
for(var i=0; i<len; i++){ //總共需要比較的輪數
for(var j=0; j<len-1-i; j++){ // 每一輪需要進行比較的數字
if( arr[j]<arr[j+1]){ // 相鄰元素相比,小的移至到右邊
var temp = arr[j+1];
arr[j+1] = arr[j];
arr[j] = temp;
}
}
}
return arr[1];
}
7 猴子第一天摘下若干個桃子,當即吃掉一半,不過癮,又多吃了一個,第二天早上又將剩下的桃子吃掉一半,又多吃了一個,以后每天早上都吃掉剩下桃子的一半零一個,到第十天早上的時候,發現只剩下一個桃子了,問猴子第一天摘下多少個桃子?
function peach(day){
var i=0,
sum=0;
for(var i=0;i<day;i++){
sum = sum*2+1;
}
return sum;
}
8 設計一個3人斗地主的發牌算法(54張牌發給三個人,最后剩下3張)
// 洗牌算法,傳入一個數組,隨機亂序排列,不污染原數組
function shuffle(arr) {
if (!arr) {
throw '錯誤,請傳入正確數組';
}
var newArr = arr.slice(0);
for (var i = newArr.length - 1; i >= 0; i--) {
// 隨機范圍[0,1)
var randomIndex = Math.floor(Math.random() * (i + 1));
var itemAtIndex = newArr[randomIndex];
newArr[randomIndex] = newArr[i];
newArr[i] = itemAtIndex;
}
return newArr;
}
// 生成一副撲克牌
function generatePoker() {
// 第一步:定義四個花色,這里就用中文了
var cardType = ['黑桃', '紅桃', '梅花', '方塊'];
// 第二步:定義13張普通牌
var cardValue = ['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K'];
// 第三步:定義2張特殊牌,大王與小王
var specialCard = ['大王', '小王'];
// 第四步:根據上述數組生成54張牌
var allCards = [];
for (var i = 0,len1 = cardType.length; i < len1; i++) {
for (var j = 0,len2 = cardValue.length; j < len2; j++) {
allCards.push(cardType[i] + cardValue[j]);
}
}
allCards = allCards.concat(specialCard);
return allCards;
}
// 隨機發N張撲克牌
function dealPoker(num) {
if(!num || num>54 || typeof(num)!== 'number') {
throw '錯誤,傳入的數字非法,只能是[1-54]';
}
// 生成撲克牌
var allCards = generatePoker();
// 洗牌-不污染原先的數組
var randomCards = shuffle(allCards);
return randomCards.slice(0, num);
}
// 測試用例
console.log(dealPoker(3));
console.log(dealPoker(4));
console.log(dealPoker(10));
// 生成一副洗好的全新亂序牌
var poker = dealPoker(54);
// 接下來如果想要發牌,依次將數組pop即可,因為它本身已經被打亂了,可以一直發完54張
9 簡述QQ登錄過程
a.輸入賬號和密碼,先進行前端的字符校驗,是否符合填寫規范
b.點擊登錄,進行ajax請求,
c.首先判斷數據庫里是否有這個賬號,沒有則給出提示該賬號尚未注冊
d.判斷輸入的密碼是否和數據庫的密碼一致
e.如果一致返回狀態成功,實現跳轉,如果不一致,則給出提示,賬號或密碼錯誤
10 輸入一個字符串,打印該字符串中字符的所有排列
function permutate(str) {
var result = [];
if(str.length > 1) {
var left = str[0];
var rest = str.slice(1, str.length);
var preResult = permutate(rest);
for(var i=0; i<preResult.length; i++) {
for(var j=0; j<preResult[i].length; j++) {
var tmp = preResult[i],slice(0, j) + left + preResult[i].slice(j, preResult[i].length);
result.push(tmp);
}
}
} else if (str.length == 1) {
return [str];
}
return result;
}
覺得讓一個前端三十分鍾做完這些題目,是不是有點~~咳咳,不說了,還是努力提升自己吧,自己比較菜,還寫不出來,有幾個是從網上找的答案,先保存着,日后再慢慢消化吧~