更新时间:2020-10-19 17:53:06 来源:极悦 浏览1143次
本文主要为大家介绍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天面授
Java就业班有基础 直达就业
业余时间 高薪转行
Java在职加薪班工作1~3年,加薪神器
工作3~5年,晋升架构
提交申请后,顾问老师会电话与您沟通安排学习