更新時間:2020-10-19 17:53:06 來源:動力節點 瀏覽1312次
本文主要為大家介紹8道經典數組和字符串經面試題,可以作為大家求職面試題的磨刀石。這8道數組和字符串面試題主要是數組和字符串相關的在面試中出現頻率較高的面試題,希望能夠給小伙伴們的面試帶來一點點幫助。
1.棧的壓入和彈出 輸入兩個整數序列,第一個序列表示棧的壓入順序,請判斷第二個序列是否可能為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列1,2,3,4,5是某棧的壓入順序,序列5,4,3,2,1或3,2,1是該壓棧序列對應的一個彈出序列,但4,3,5,1,2就不可能是該壓棧序列的彈出序列。function IsPopOrder(pushV,popV){
if(pushV.length === 0) return false;
var stack = []; // 模擬棧
for(var i = 0, j = 0; i < pushV.length;){
stack.push(pushV[i]);
i += 1;
// 壓入棧的值需要被彈出
while(j < popV.length && stack[stack.length-1] === popV[j]){
stack.pop();
j++;
if(stack.length === 0) break;
}
}
return stack.length === 0;
}
2.利用棧模擬隊列思路:對棧A添加數據。如果棧B為空,循環將棧A中內容彈出放入棧B,并彈出棧B最后一項如果棧B不為空,則直接彈出棧B的最后一項ar stackA = [];
var stackB = [];
function push(node){
stackA.push(node);
}
function pop(){
if(!stackB.length){
while(stackA.length){
stackB.push(stackA.pop());
}
}
return stackB.pop();
}
3. 找出連續最長不重復字符串在一個字符串中找出連續的不重復的最大長度的字符串,解決這類問題的思路:利用循環疊加字符串,直到出現重復為止每一次疊加,記錄下來最大長度的字符串// 連續最長不重復字符串
function getMaxLenStr(str) {
var cur = [];
var maxLenStr = '';
for(var i = 0; i < str.length; i++) {
if(!cur.includes(str[i])) {
cur.push(str[i]);
} else {
cur = []; // 置為空
cur.push(str[i]);
}
// 存儲最大長度的字符串
if(maxLenStr.length < cur.length) {
maxLenStr = cur.join('');
}
}
return maxLenStr;
}
getMaxLenStr('ababcabcde'); // abcde
方法二:var str = "aababcabcdeabcdefaababc";
var x = str.split('').reduce((a, b, index) => {
if(a.indexOf(b) !== -1) {
return a;
}
a.push(b);
return a;
}, []).join('');
console.log(x)
方法三:var s = "aababcabcdeabcdefaababc";
var lengthOfLongestSubstring = function(s) {
var str = ""; // 用于存放無重復字符串
var arr = [];
for(var i = 0; i < s.length; i++) {
var char = s.charAt(i);
var index = str.indexOf(char);
if(index === -1) {
str += char;
arr.push(str);
} else {
str = str.substr(index + 1) + char;
}
}
return arr.reduce((a, b) => {
return b.length > a.length ? b : a;
}, '');
};
console.log(lengthOfLongestSubstring(s));
4. 求一個數組當中,連續子向量的最大和。function FindGreatestSumOfSubArray(arr) {
let sum = arr[0];
let max = arr[0];
for(let i = 1; i < arr.length; i++) {
if(sum < 0) {
sum = arr[i];
}else{
sum += arr[i];
}
// 記錄最大值
if(max < sum) {
max = sum;
}
}
return max;
}
5. 給定一個編碼字符,按編碼規則進行解碼,輸出字符串 編碼規則:coount[letter] ,將letter的內容count次輸出,count是0或正整數,letter是區分大小寫的純字母。實例:const s= 3[a]2[bc]; decodeString(s); // 返回'aaabcbc'const s= 3[a2[c]]; decodeString(s); // 返回 'accaccacc' const s= 2[ab]3[cd]ef; decodeString(s); // 返回 'ababcdcdcdef'思路: 使用棧這種數據結構,如果 push 的內容為‘]’,則循環 pop 字符,直到碰到 ’[‘,然后將pop 出來的字符串按規則整理后,重新 push 進棧中,最后將棧內的內容拼接成字符串輸出即可。
方法1:function decodeString(str) {
let stack = []; // 存儲字符串的棧
for (let i = 0; i < str.length; i++) {
let cur = str[i];
if (cur !== ']') {
stack.push(cur);
} else { // 彈出
let count = 0;
let loopStr = [];
let popStr = '';
while ((popStr = stack.pop()) !== '[') {
loopStr.unshift(popStr);
}
count = stack.pop();
// 添加結果
let item = '';
for (let i = 0; i < count; i++) {
item += loopStr.join('');
}
stack.push(...(item.split('')));
}
}
return stack.join('');
}
方法2:const str = '3[a]2[bc]';
function decodeString(str) {
let Counts = str.split(/\[[a-zA-Z]+\]/);
let Letters = str.match(/[a-zA-Z]+/g);
let newString = "";
Letters.forEach((item,index)=>{
for (var n=0;n<counts[index];n++) p="" {<="">
newString += item;
}
})
return newString;
}
console.log(decodeString(str))
6. 實現一個方法,限定數組中元素出現的次數,第一個參數為數組,第二個參數為限制數組中元素出現的最多次數;要求不改變原素組的順序;例如:deleteNth((1, 1 1, 1), 2); //return [1, 1]
deleteNth((20, 37, 34, 20, 20, 37), 2); //return [20, 37, 34, 20, 37];復制代碼方法1:var arr = [4, 4, 4, 4, 3, 3, 3, 3, 1, 2, 4, 3, 90];
function deleteNth(arr, n) {
var newArr = [];
for (var i = 0; i < arr.length; i++) {
if (newArr.indexOf(arr[i]) == -1) {
newArr.push(arr[i]);
}
}
for (var i = 0; i < newArr.length; i++) {
var sum = 0;
for (var j = 0; j < arr.length; j++) {
if (arr[j] == newArr[i]) {
sum ++;
if (sum > n) {
arr.splice(j, 1);
j--;
}
}
}
}
return arr;
}
console.log(deleteNth(arr, 2))復制代碼方法2:var arr = [1, 1, 2, 5, 23, 23, 1, 1];
function deleteNth(arr, n) {
let newArr = arr.map( item => {
return item;
})//原始數據副本
let newArr1 = [];//處理后的數據
for (var i = 0; i < newArr.length; i++) {
if (newArr1.indexOf(newArr[i]) < 0) {
newArr1.push(newArr[i]);
} else if (newArr1.indexOf(newArr[i]) > -1) {
let hasIndexArr = [];//用于存放相匹配的項的索引
for (let j = 0; j < newArr1.length; j++) {
if (newArr1[j] == newArr[i]) {//將匹配的項的索引扔進hasIndexArr
hasIndexArr.push(j);
}
}
if (hasIndexArr.length < n) {//如果數量還不滿足n,扔進去
newArr1.push(newArr[i]);
}//如果數量已經滿足,則跳過
}
}
return newArr1;
}
console.log(deleteNth(arr,1))復制代碼方法3:var arr = [4, 4, 4, 4, 3, 3, 3, 3, 1, 2, 4, 3, 90];
var cache = {};
function deleteNth(arr, x) {
return arr.filter(function (n) {
cache[n] = (cache[n]||0) + 1;
return cache[n] <= x;
})
}
console.log(deleteNth(arr, 1))
7. 實現一個方法,于數組中尋找某個值作為分割的界點,使得該值左右兩邊的數相加相等[1, 2, 3, 4, 3, 2, 1] => 返回下標3
[1, 100, 50, -51, 1, 1] => 返回下標1復制代碼方法1:var arr = [1, 2, 3, 4, 3, 2, 1];
function find (arr) {
var sum1 = 0;
for (var i = 0 ; i < arr.length ; i ++) {
sum1 += arr[i];
var sum2 = 0;
for (var j = i + 2 ; j < arr.length ; j ++) {
sum2 += arr[j];
}
if (sum1 == sum2) {
return i + 1;
} else if (i == arr.length - 3 && sum1 !== sum2) {
return "該值不存在";
}
}
}
console.log(find(arr))復制代碼方法2:var arr = [1, 2, 3, 4, 3, 2, 1];
for (var i = 0 ; i < arr.length - 2 ; i ++) {
var arr1 = arr.slice(0, i+1);
var arr2 = arr.slice(i+2);
var sum1 = sum2 = 0;
for (var m = 0 ; m < arr1.length ; m ++) {
sum1 += arr1[m];
}
for (var n = 0 ; n < arr2.length ; n ++) {
sum2 += arr2[n];
}
if (sum1 == sum2) {
console.log(i + 1);
break;
} else if (i == arr.length - 3 && sum1 !== sum2) {
console.log("該值不存在");
}
}
8. 自定義事件 var content = document.querySelector('.content');
// 自定義事件
var evt = new Event('custom');
var customEvt = new CustomEvent('customEvt', {
// 通過這個屬性傳遞參數
detail: {
name: 'tom',
age: 12
}
});
content.addEventListener('custom', (e) => {
console.log('自定義事件被觸發,無參數...');
console.log(e);
});
content.addEventListener('customEvt', (e) => {
console.log('自定義事件被觸發,有參數...');
console.log(e);
console.log(e.detail);
});
// 點擊時觸發這個自定義事件
content.addEventListener('click', (e) => {
content.dispatchEvent(evt);
content.dispatchEvent(customEvt);
});
小伙伴們可以拿上面的8道題數組和字符串面試題小試牛刀,檢驗一下自己學習Java的真實水平。如果覺得題目太少也沒關系,本站的Java面試題庫里有著海量的面試好題,是Java程序員面試刷題必備的哦。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習