【学习笔记28】JavaScript数组字符串面试题
2023-09-11 14:14:57 时间
笔记首发
一、有10个学生的成绩存在数组中, 请统计大于等于平均成绩的人数
1、方法一
const arr = [50, 69, 70, 56, 77, 67, 70, 78, 67, 59];
// 定义变量 存储数据
let count = 0;
let sum = 0;
let avg = 0;
arr.forEach(function (item) {
sum += item;
// 再循环最后一轮的时候,会计算出数组的实际平均值
avg = sum / 10
})
console.log(avg); //平均值
arr.forEach(function (item) {
// 统计大于等于平均成绩的人数
if (item > avg) {
count++
}
})
console.log(count); //统计的人数
2、方法二
const arr = [50, 69, 70, 56, 77, 67, 70, 78, 67, 59];
// 1.1 计算平均值
let num = arr.reduce(function (prev, item) {
// 求和
return prev + item;
})
// 求平均值
num = num / arr.length;
console.log(`平均值:${num}`);
// 1.2找到符合条件的人数
// 定义变量 存储符合条件的人数
let count = 0;
arr.forEach(function (item) {
// 判断符合条件的人数
if (item >= num) {
count++;
}
})
console.log(`人数:${count}`);
二、将"i love javascript very much"的每个单词的第一个字母,变为大写
let str = 'i love javascript very much';
let arr = str.split(' ');
// console.log(arr);
// 定义变量 存储数据
let newStr = '';
for (let i = 0; i < arr.length; i++) {
// 将第一个字母变大写
let FristStr = arr[i].charAt(0).toUpperCase();
// 剪切
let VStr = arr[i].slice(1, arr[i].length);
// 合并
newStr += FristStr + VStr + ' '
// newStr += item.charAt(0).toUpperCase() + item.slice(1) + ' '
}
newStr = newStr.trimEnd();
console.log(newStr);
三、数组去重
const arr = [1, 8, 1, 2, 3, 7, 6, 6, 6, 4, 5, 5, 5];
// 方法一:indexOf
arr.sort(function (a, b) { return a - b })
// 定义变量 存储数据
const newArr1 = [];
arr.forEach(function (item) {
// console.log(item, index);
if (newArr1.indexOf(item) === -1) {
newArr1.push(item);
}
})
console.log(newArr1);
// 方法二:set去重
var newArr2 = [...new Set(arr)];
console.log(newArr2);
四、数组排序
// sort 排序
const arr = [1, 8, 1, 2, 3, 7, 6, 6, 6, 4, 5, 5, 5];
arr.sort(function (a, b) { return a - b })
console.log(arr);
// 冒泡排序
for (let j = 0; j < arr.length - 1; j++) {
for (let i = 0; i < arr.length - 1 - j; i++) {
if (arr[i] > arr[i + 1]) {
let temp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = temp;
}
}
}
console.log(arr);
// 选择排序
for (let j = 0; j < arr.length - 1; j++) {
// 定义变量 存储最小下标
let minIndex = j;
for (let i = j + 1; i < arr.length; i++) {
if (arr[minIndex] > arr[i]) {
minIndex = i;
}
}
// 交换真实最小下标
let temp = arr[j];
arr[j] = arr[minIndex];
arr[minIndex] = temp;
}
console.log(arr);
五、数组转对象
const arr = ['a', 'a', 'a', 'b', 'b', 'c', 'c', 'c', 'c', 'd', 'd', 'd', 'd'];
let obj = {};
for (let i = 0; i < arr.length; i++) {
// if( obj[arr[i]] === undefined){
if (!obj[arr[i]]) {
obj[arr[i]] = 1;
} else {
obj[arr[i]]++;
}
}
console.log(obj);
六、有一个长度为100的数组, 求出该数组前10个元素之和
1、我的方法
// 定义空数组 存储长度为100的数组
const arr = [];
// 定义变量 存储元素之和
let sum = 0;
for (let i = 1; i <= 100; i++) {
// 将数字添加到数组中
arr.push(i);
}
console.log(arr);
// 求前10个元素的和
arr.forEach(function (item, index) {
if (index <= 9) {
sum += item;
}
})
console.log(sum);
2、代码实现
// 1. 找到数组前 10个元素;
// 2. 求和
var arr = [9, 8, 1, 4, 6, 3, 7, 2, 5, 10, 110000000, 120000000, 13000000000]
// 1. 找到数组前 10 个元素
var newArr = arr.splice(0, 10)
console.log(newArr)
// 2. 求和
var num = newArr.reduce(function (prev, item) {return prev + item})
console.log(num)
七、引用数据类型分析题
1、我的分析
var x = [1, 2, 3];
var y = x; // y = [1, 2, 3];
y[0] = 10;
x[2] = 30; // y = [10, 2, 30];
console.log(x, y);
/**
* 分析如下:
* x = [10, 2, 30];
* y = [10, 2, 30];
*
* 因为x,y是引用数据类型 改变的地址
* 当y改变的时候 x也会改变
* 因此x,y输出的是一样的
*/
2、分析
var x = [1, 2, 3]; // x == QF001 QF001 == [1, 2, 3]
var y = x; // y == QF001 QF001 == [1, 2, 3]
y[0] = 10; // 修改变量y[0] 的值, 其实就是修改地址 QF001 的内容 ----> QF001 == [10, 2, 3]
x[2] = 30; // 修改变量x[2] 的值, 其就是修改地址 QF001 的内容 ---> QF001 == [10, 2, 30]
console.log(x, y); // x --- y 相当于打印两次 QF001 ---> [10, 2, 30] [10, 2, 30]
八、引用数据类型分析题
1、我的分析
var x = [1, 2, 3];
var y = x; // y = [1, 2, 3]
var z = [4, 5, 6];
y[0] = 10; // y = [10, 2, 3]
y = z; // y = [4, 5, 6]
z[1] = 20; // z = [4, 20, 6]
x[2] = 30; // x = [10, 2, 30]
console.log(x, y, z);
/**
* 分析如下:
* x,y,z 都是引用数据类型 x = [10, 2, 30]
* var y = x; 因此y和x在一个地址空间
* y[0] = 10; // y = [10, 2, 3]
* x[2] = 30; // x = [10, 2, 30]
*
* 因为y = z; // y = [4, 5, 6]
* 所以y的地址改变 y和z是一个地址空间
*
* y = [4, 20, 6]
* z = [4, 20, 6]
*/
2、分析
var x = [1, 2, 3]; // x == QF001 QF001 == [1, 2, 3]
var y = x; // y == QF001 QF001 == [1, 2, 3]
var z = [4, 5, 6]; // z == QF002 QF002 == [4, 5, 6]
y[0] = 10; // 修改y[0] 的值, 其实就是修改 QF001; QF001 == [10, 2, 3]
y = z; // y == QF002 QF002 == [4, 5, 6] !!! 注意, 此时切断了y和x之间的关系
z[1] = 20; // 修改z[1] 的值, 其实就是修改 QF002; QF002 = [4, 20, 6]
x[2] = 30; // 修改x[2] 的值, 其实就是修改 QF001; QF001 == [10, 2, 30]
console.log(x, y, z);
/**
* x == QF001 ---> [10, 2, 30]
* y == QF002 ---> [4, 20, 6]
* z == QF002 ---> [4, 20, 6]
*/
九、请自己手写一个函数, 实现数组的push功能
var arr = [1, 2, 3];
function myPush(fnArr, num) {
// 1. 在数组末尾添加一个数据
// fnArr.splice(arr.length, 0, num);
fnArr[fnArr.length] = num;
// 2. 返回一个最新数组的长度
return fnArr.length;
}
var num = myPush(arr, 5);
console.log(arr, num); // [1, 2, 3, 5]
十、解决问题
/**
* 10. 买卖股票的最佳时机;给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
如果你最多只允许完成一笔交易(即买入和卖出一支股票一次)设计一个算法来计算你所能获取的最大利润。
* 注意: 你不能再购买股票的前一天卖出股票
*
* 示例: 输入:[7, 1, 5, 3, 6, 4] 输出:5
*
* 解释: 在第2天(当天股票价格等于1)的时候买入,在第五天(当天股票价格等于6)的时候卖出,最大利润为 6 - 1 = 5。
* 注意:利润不能是7 - 1 = 6,因为第二天的价格为1,第一天的价格为7,你是不可能在第二天买入股票然后等到第一天卖出的
*/
/**
* 逻辑: 当前项与后续的所有成员中, 差值最大的
* 1. 双重for循环, 拿到数组的每一项与后续的所有项
* 2. 计算出最大的差值并存储
*/
var arr = [7, 1, 5, 3, 6, 4, 100];
// 定义变量 存储最大的差值
var max = 0
for (var i = 0; i < arr.length; i++) {
for (var k = i + 1; k < arr.length; k++) {
// console.log(`当前项 ${i}; 后续的每一个项 ${k}`)
if (arr[k] - arr[i] > max) {
max = arr[k] - arr[i];
}
}
}
console.log(max)
相关文章
- JavaScript内置对象--Math对象
- javascript滚动到大于一定距离显示隐藏
- 第一百四十节,JavaScript,封装库--浏览器检测
- javascript中的值如何传递到django下的views.py中或者数据库中?
- 面向对象的JavaScript(一)命名空间
- [Javascript] Correctly Type-Checking Numbers
- [Javascript] Multiply Two Arrays over a Function in JavaScript
- [Javascript] Replicate JavaScript Constructor Inheritance with Simple Objects (OLOO)
- [Javascript] Understanding the .constructor property on JavaScript Objects
- [Javascript] Link to Other Objects through the JavaScript Prototype Chain
- [WASM] Read WebAssembly Memory from JavaScript
- [Javascript] Proper use of console.assert in JavaScript
- [Javascript] Linting JavaScript with ESLint
- 合格前端系列第六弹-从指向看JavaScript
- [Javascript] Wait for Multiple JavaScript Promises to Settle with Promise.allSettled()
- [Javascript] Conditionally spread entries to a JavaScript object
- [Javascript] Replicate JavaScript Constructor Inheritance with Simple Objects (OLOO)
- [Javascript] JavaScript赋值时的传值与传址
- [Javascript] Delegate JavaScript (ES6) generator iteration control
- [Javascript] Compose multiple functions for new behavior in JavaScript
- [Javascript] String method: endsWith() && startsWith()
- [Javascript] Hoisting in JavaScript
- JavaScript与有限状态机
- webpack里JavaScript文件编译的调试
- Cordova插件中JavaScript代码与Java的交互细节介绍
- JavaScript操作字符串的常用方法总结:增、删、改、查(前端常见面试题必考必问
- 已解决selenium.common.exceptions.JavascriptException: Message: javascript error: Cannot read properties
- javascript基础修炼(1)——一道十面埋伏的原型链面试题
- ASP.NET—011:JavaScript报错常见问题
- javascript-时间戳