题目一
用js实现一个用户行收集器,功能如下:
1,收集用户在页面中的所有click行为,并使用log方法发送日志,包含触发事件的节点xpath信息
2,xpath需包含tagName、id、class、同级同名节点索引(从1开始),如
<body> <div id=“container”> <p>something</p> <a id=“link1” class=“link-class”></a> <a id=“link2” class=“link-class current”>target link</a> </div> </body>
点击target link时,xpath为 body[1]/div[1][@id=“container”]/a[2][@id=“link2”][contains(@class, “link-class")][contains(@class, “current")]
3,不侵入、不影响其他业务代码的执行
var obody=document.getElementsByTagName('body')[0]; obody.addEventListener('click',function(e){ console.log('1'); console.log(getXPath(e.target)); }) function getXPath(target){ if(target.nodeName=='BODY') return 'body[1]'; var index=1; var str=''; var tempTarget=target; var nodeName=target.nodeName; var id=target.id; var classList=target.classList; while(tempTarget.previousElementSilblig!=null){ if(tempTarget.previousElementSilbling.nodeName==nodeName){ index++; console.log(index); } tempTarget=tempTarget.previousElementSilblig; } str='/'+nodeName.toLowerCase()+'['+index+']'; if(id){ str+='[@id="'+id+'"]'; } classList.forEach(function(ele,index,self){ str+='[contains(@class,"'+ele+'")]'; }) return getXPath(target.parentNode)+str; }
题目二
小明要为n个人计划一次火星的探险,其中一个重要的任务是为每个参与者安排食物。仓库里面有m个能用一天的食物包裹,每个食物包裹有不同的类型ai。
每个人每天必须用且只能用一个食物包裹。由于某些原因,在整个过程中,每个人只能用同一种类型的食物包裹,但是不同的人用的食物包裹可以不一样。
给出人数以及食物包裹的情况,请你求出这趟探险最多可以持续多少天。
#include<iostream> #include<vector> #include<algorithm> using namespace std; int main(){ int n=0; int m=0; cin>>n>>m; vector<int> a; int k=0; for(int i=0;i<m;i++){ cin>>k; a.push_back(k); } sort(a.begin(),a.end()); int l[100]={0}; for(int i=0;i<a.size();i++){ l[a[i]]++; } sort(l,l+100); vector<int> h; for(int j=0;j<100;j++){ if(l[j]>0) { h.push_back(l[j]); } } //最多的天数 int g=m/n; int c=h.size()-1; int b=0; int flag=0; int d=n; for(int j=g;j>0;j--){ for(int c=h.size()-1;c>=0;c--){ b=h[c]/j; d=d-b; if(d<=0){ cout<<j<<endl; flag=1; break; } } if(flag==1){ break; }else{ d=n; } } if(flag==0){ cout<<'0'<<endl;} return 0; }
题目三
系统会随机生成id为jsLayout的 m x n 表格(m >= 3, n >= 3),请按照如下需求实现bind函数
1、bind 函数为每个td节点绑定click事件,当某个td节点被点击时class变为current,同时以该td为中心的九宫格td节点class变为wrap,具体效果参考以下图片
2、每次click后,请清空所有不需要变动的td节点的class
3、请不要手动调用bind函数
4、当前界面为系统生成 10 * 10 表格,执行 bind 函数,并点击第一个td后的效果
5、请不要手动修改html和css
6、不要使用第三方插件
7、请使用ES5语法
var tds = document.querySelectorAll("td") for (let i = 0; i < tds.length; i++) { // 给单个表格添加click事件监听,当被点击时,先清除整个表格的所有的样式 tds[i].addEventListener("click", function () { for (let j = 0; j < tds.length; j++) { tds[j].className = "" } // 给当前被点击的td添加类 tds[i].classList.add("current") // 如果有下一个姐妹 if (tds[i].nextElementSibling) tds[i].nextElementSibling.classList.add("wrap") //如果有前一个姐妹 if (tds[i].previousElementSibling) tds[i].previousElementSibling.classList.add("wrap") // 如果有下一行,因为一行有10个所以%10 if (tds[i].parentElement.nextElementSibling !== null) { tds[i].parentElement.nextElementSibling.children[i % 10].classList.add("wrap") //不在右边界 if ((i % 10) !== 9) { if (tds[i].parentElement.nextElementSibling.children[(i + 1) % 10] !== null) { tds[i].parentElement.nextElementSibling.children[(i + 1) % 10].classList.add("wrap") } } //不在左边界 if ((i % 10) !== 0) { if (tds[i].parentElement.nextElementSibling.children[(i - 1) % 10] !== null) { tds[i].parentElement.nextElementSibling.children[(i - 1) % 10].classList.add("wrap") } } } if (tds[i].parentElement.previousElementSibling !== null) { tds[i].parentElement.previousElementSibling.children[i % 10].classList.add("wrap") if ((i % 10) !== 9) { if (tds[i].parentElement.previousElementSibling.children[(i + 1) % 10] !== null) { tds[i].parentElement.previousElementSibling.children[(i + 1) % 10].classList.add("wrap") } } if ((i % 10) !== 0) { if (tds[i].parentElement.previousElementSibling.children[(i - 1) % 10] !== null) { tds[i].parentElement.previousElementSibling.children[(i - 1) % 10].classList.add("wrap") } } } }) }