1.判断一个单词是否是回文?
回文是指把相同的词汇或句子,在下文中调换位置或颠倒过来,产生首尾回环的情趣,叫做回文,也叫回环。比如 mamam redivider .
很多人拿到这样的题目非常容易想到用for 将字符串颠倒字母顺序然后匹配就行了。其实重要的考察的就是对于reverse的实现。其实我们可以利用现成的函数,将字符串转换成数组,这个思路很重要,我们可以拥有更多的自由度去进行字符串的一些操作。
function checkPalindrom(str) {
return str == str.split('').reverse().join('');
}
2. 去掉一组整型数组重复的值
比如输入: [1,13,24,11,11,14,1,2]
输出: [1,13,24,11,14,2]
需要去掉重复的11 和 1 这两个元素。
let unique = function(arr) {
let hashTable = {};
let data = [];
for(let i=0,l=arr.length;i<l;i++) {
if(!hashTable[arr[i]]) {
hashTable[arr[i]] = true;
data.push(arr[i]);
}
}
return data
}
3.统计一个字符串出现最多的字母
输入 : afjghdfraaaasdenas
输出 : a
前面出现过去重的算法,这里需要是统计重复次数。
function findMaxDuplicateChar(str) {
if(str.length == 1) {
return str;
}
let charObj = {};
for(let i=0;i<str.length;i++) {
if(!charObj[str.charAt(i)]) {
charObj[str.charAt(i)] = 1;
}else{
charObj[str.charAt(i)] += 1;
}
}
let maxChar = '',
maxValue = 1;
for(var k in charObj) {
if(charObj[k] >= maxValue) {
maxChar = k;
maxValue = charObj[k];
}
}
return maxChar;
}
另一种写法:
function getMaxAndIndex( arr ){
if(!arr.length) return;
if(arr.length==1) return 1;
var h={}, maxnum=0,maxel='';
for(var i=0;i<arr.length;i++){
var a=arr[i]
h[a]==undefined ? h[a]=1 : (h[a]++)
if(h[a]>maxnum){
maxnum=h[a]
maxel=a
}
}
return '出现次数最多的元素为:'+maxel+'出现次数:'+maxnum
}
4.排序算法
冒泡排序
function bubbleSort(arr) {
for(let i = 0,l=arr.length;i<l-1;i++) {
for(let j=0;j<arr.length-1-i;j++) {
if(arr[j]>arr[j+1]) {
let tmp = arr[j]
arr[j] = arr[j+1]
arr[j+1] = tmp
}
}
}
return arr;
}
快速排序
function quickSort(arr) {
if(arr.length<=1) {
return arr;
}
let leftArr = [];
let rightArr = [];
let q = arr[0];
for(let i = 1,l=arr.length; i<l; i++) {
if(arr[i]>q) {
rightArr.push(arr[i]);
}else{
leftArr.push(arr[i]);
}
}
return [].concat(quickSort(leftArr),[q],quickSort(rightArr));
}
5.不借助临时变量,进行两个整数的交换
输入 a = 2, b = 4 输出 a = 4, b =2
主要是利用 + - 去进行运算,类似 a = a + ( b - a) 实际上等同于最后 的 a = b;
function swap(a , b) {
b = b - a;
a = a + b;
b = a - b;
return [a,b];
}
使用canvas 绘制一个有限度的斐波那契数列的曲线?
斐波那契数列,又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列主要考察递归的调用。我们一般都知道定义
fibo[i] = fibo[i-1]+fibo[i-2];
生成斐波那契数组的方法
function getFibonacci(n) {
var fibarr = [];
var i = 0;
while(i<n) {
if(i<=1) {
fibarr.push(i);
}else{
fibarr.push(fibarr[i-1] + fibarr[i-2])
}
i++;
}
return fibarr;
}
剩余的工作就是利用canvas arc方法进行曲线绘制了
7.出下列正数组的最大差值比如:
输入 [10,5,11,7,8,9]
输出 6
function getMaxProfit(arr){
var max=arr[0];
var min=arr[0];
var res=0;
for (var i = 1; i < arr.length; i++) {
if(arr[i]>max){
max=arr[i];
}
if(arr[i]<min){
min=arr[i]
}
res=max-min;
}
return res;
}
8随机生成指定长度的字符串
比如给定 长度 8 输出 4ldkfg9j
function getMaxStr(n) {
let str = 'abcdefghijklmnopqrstuvwxyz9876543210';
var tmp=''
for(let i=0;i<n;i++){
tmp+= str.charAt(Math.floor(Math.random()*str.length))
}
return tmp
}
9.实现类似getElementsByClassName 的功能
自己实现一个函数,查找某个DOM节点下面的包含某个class的所有DOM节点?不允许使用原生提供的 getElementsByClassName querySelectorAll 等原生提供DOM查找函数。
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>原生JS实现getElementsByClassName()</title>
<script>
window.onload = function() {
var oUl = document.getElementById('ull');
function getElementsByClassName(obj,classname){
var result = [];
var aEls = document.getElementsByTagName('*');
for(var i = 0; i<aEls.length; i++){
//查找有多个属性的元素
var classnames = aEls[i].className.split(' ')
if(indexOf(classname,classnames)!=-1){
result.push(aEls[i]);
}
}
return result;
}
function indexOf(classname,classnames){
for(var i = 0; i<classnames.length; i++){
if(classname==classnames[i]){
return i;
break;
}
}
if(i = classnames.length) return -1;
}
//alert(indexOf('box',['box1','box']));
alert(getElementsByClassName(oUl,'box').length);
}
</script>
</head>
<style>
li{
width:100px;
height:28px;
margin-left:20px;
list-style: none;
background: gray;
margin:2px;
}
.box{
background:orange;
}
.box1{
background:green;
}
</style>
<body>
<ul id="ull">
<li>0</li>
<li class='box box'>1</li>
<li>2</li>
<li class='box1'>3</li>
<li class='box1'>4</li>
<li class='box box1'>5</li>
</ul>
</body>
</html>
10.获取指定范围内的随机数
当我们需要获取指定范围(min,max)内的整数的时候,下面的代码非常适合。
function getRadomNum(min,max){
return Math.floor(Math.random() * (max - min + 1)) + min;
}
11.随机获取数组中的元素
function getRadomFromArr(arr){
return arr[Math.floor(Math.random()*arr.length)];
}
12 生成从0到指定值的数字数组
var arr=[]
for(var i=1;i<=100;i++){
arr.push(i)
}
console.log(arr)
14 打乱数字数组的顺序
var arr = [1,2,3,4,5,6,7,'a','dsfs',8,9,'v'];
arr.sort(function(){return Math.random()-0.5});
15 对象转换为数组
//注意对象必须是以下格式的才可以通过此方式转化为数组
//获取的DOM集合,以及函数的arguments也可以通过此方式转化为数组
var obj={
0:'qian',
1:'long',
2:'chu',
3:'tian',
length:4
}
var _slice=[].slice;
var objArr=_slice.call(obj);
16. 验证是否为数组
function isArray(obj){
return Object.prototype.toString.call(obj) === '[object Array]' ;
}
17 获取数组中最大或者最小值
该方法适合一维或者多维数组求最大最小值的情况
function maxAndMin(arr){
return {
max:Math.max.apply(null,arr.join(',').split(',')),
min:Math.min.apply(null,arr.join(',').split(','))
}
}
18 清空数组
//方式一 通过将长度设置为0
var arr=[1,2,3,4,5];
arr.length=0;
//方式二 通过splice方法
var arr=[1,2,3,4,5];
arr.splice(0,arr.length);
//方式三 通过将空数组 [] 赋值给数组(严格意义来说这只是将ary重新赋值为空数组,之前的数组如果没有引用在指向它将等待垃圾回收。)
var arr=[1,2,3,4,5];
arr=[];
19保留指定小数位
var num =4.345678;
num = num.toFixed(4); // 4.3457 第四位小数位以四舍五入计算
20 找出数组中出现次数最的元素,并给出其出现过的位置
function getMaxAndIndex( arr ){
var obj = {};
arr.forEach(function(item,index){
if(!obj[item]){
obj[item]= {indexs: [index]}
}else{
obj[item]['indexs'].push(index);
}
});
var num=0;//记录出现次数最大值
var str='';//记录出现次数最多的字符
var reArr;//返回最大值的位置数组
for(var attr in obj){
var temp=obj[attr]['indexs'];
if(temp.length>num){
num=temp.length;
str=attr;
reArr=temp;
}
}
return {
maxStr:str,
indexs:reArr
}
}
21 查找字符串中的最长公共前缀
示例: 输入: [“flower”,“flow”,“flight”]
输出: “fl”
function getMaxAndIndex( arr ){
var firstStr = arr[0], result = ''
if(!arr.length) return result
for(let i=0;i<firstStr.length;i++){
for(let j=1;j<arr.length;j++){
if(firstStr[i]!=arr[j][i]){
return result
}
}
result += firstStr[i]
}
return result
}