JS的学习:
JavaScript是一种运行在客户端(浏览器)的编程语言,实现人机交互的效果
主要作用:
- 网页特效
- 表单验证
- 数据交互
JS的组成
ECMAScript
规定了js基础的语法核心知识
Web APIs
DOM:操作文档,对页面元素进行移动、大小、添加删除操作。
BOM:操作浏览器,比如页面弹窗、检测窗口宽度、存储数据到浏览器。
JS引用方式:(在body标签里面)
JS输出语句:
输入语句:
console.log 控制台输出
需要注意的是:alert()和prompt()会跳过页面渲染先被执行。
JS声明变量
let 变量名称
声明数组:
let 数组名=[数据1,数据2……数据n]
拼接字符串和变量
JS类型转换:
- 隐式转换
+号俩边只要有一个是字符串,都会变成字符串 +号作为正号解析可以转换成数字类型
- * /都会把数据变成数字类型
- 显示转换:
Number(数据)
转换成数字类型
如果字符串里面有非数字,则结果为NaN
NaN是number的一种,代表非数字
parseInt(数据)转换为整型
parseFloat(数据)转换为浮点型
==只要值相等,就会返回true
而===需要数据类型和值一样的都相等才能返回true
开发中,判断是否相等,用的是===
关于JavaScript的一个案例:
2023-06-14 01-13-33-214
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="CSS/demo0612.css">
<title>demo0612</title>
</head>
<body>
<script>
let num=[];
for(let i=1; i <= 4;i ++)
{
num[i]=+prompt(`请输入第${i}季度的数据:`);
}
document.write(`<div class="xy">`)
for(let i = 1;i <= 4; i ++)
{
document.write(
`<div class="y" style="height:${num[i]}px">
<span>${num[i]}</span>
<h4>第${i}季度</h4>
</div>`
)
}
document.writer(`</div>`)
</script>
</body>
</html>
.xy
{
display:flex;
align-items:flex-end;
text-align:center;
width:500px;
height:500px;
margin:10px auto;
border-left:2px solid #ccc;
border-bottom:2px solid #ccc;
}
.y
{
margin:0px 20px 0 20px;
display:flex;
width:80px;
background-color:pink;
flex-direction:column;
justify-content:space-between;
}
.y h4
{
margin-bottom:-35px;
}
.y span
{
margin-top:-20px;
}
函数:
function 函数名称()
{
语句
}
调用和c语言一模一样——函数名称()
匿名函数
- 函数表达式:
fn=function(); 这个里面没有函数名称,调用的时候是fn()
- 立即执行函数
(function(){})()
(funtion(){}())
对象:
增加对象属性:
删除对象属性
查找:
定义方法:
遍历对象的属性:
遍历对象数组:
JavaScript内置对象-Math
大部分和c的差不多,需要注意下面这俩个不一样的
- cell 向上取整
- floor 向下取整
在JavaScript中,const修饰的基本数据类型是不可以改变的,修饰的对象数据类型地址不变,就可以改变。
DOM
DOM是文档对象类型,是用来呈现以及与任意HTML或者XML文档交互的API(就是浏览器提供的一套专么用来操作网页内容的功能)
DOM作用:开发网站内容特效和实现用户交互。
DOM树
- 是将HTML文档以树状结构直观的表现出来,我们称之为文档或者DOM树
- 描述网页内容关系的名词
作用:直观的体现了标签与标签之间的关系。
DOM对象
- 浏览器根据html标签生成的js对象
- 所有的标签属性都可以在这个对象上面找到,修改这个对象的属性会自动映射到标签身上
DOM的核心思想:把网页内容当作对象来处理
DOM里面最大的对象是document,所有document提供的属性和方法是用来访问和操作网页内容的
网页所有的内容都在document里面。
获取DOM元素
- 借助css选择器:
document.querySelector('CSS选择器') 必须要加引号,否则会当成变量
每次选择的都是第一个,没有就是null
document.querySelectorAll('CSS选择器') 返回的是一个集合
题解:
第二周任务 [Cloned] - Virtual Judge (vjudge.net)
这道题 其实可以把这个看成一个循环的数组
每次都执行一种操作:
把第一行放到最后一行,其他的往上移动
把第一列放到最后一列,其他的往就移动
然后就能通过求余就能对应上对应的列
#include<stdio.h>
#define Maxsize 35
char a[Maxsize][Maxsize],b[Maxsize][Maxsize];
int main()
{
int n,m,i,j,tx,ty,x,y,flag=0;
scanf("%d%d",&n,&m);
for(i=0;i<n;i++)
{
scanf("%s",a[i]);
}
for(i=0;i<n;i++)
{
scanf("%s",b[i]);
}
flag=0;
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
flag=1;
for(x=0;x<n;x++)
{
for(y=0;y<m;y++)
{
tx=(x+i)%n;
ty=(y+j)%m;
if(a[tx][ty]!=b[x][y])
{
flag=0;
}
}
}
if(flag) break;
}
if(flag) break;
}
if(flag) puts("Yes");
else puts("No");
return 0;
}
第二周任务 [Cloned] - Virtual Judge (vjudge.net)
这是一题dfs题目,就判断四个方向的是否都是#就可以了。
#include<stdio.h>
#define Maxsize 110
char a[Maxsize][Maxsize];
int next[4][2]={-1,-1,1,-1,-1,1,1,1},n,m;
int is(int x,int y)
{
int i,j,k,tx,ty;
if(a[x][y]!='#') return 0;
for(k=1;;k++)
{
for(i=0;i<4;i++)
{
tx=x+k*next[i][0];
ty=y+k*next[i][1];
if(tx<0||ty<0||tx>=n||ty>=m) return k-1;
if(a[tx][ty]!='#') return k-1;
}
}
return n>m?m:n;
}
int main()
{
int i,j,b[Maxsize]={0},k,r;
int tx,ty;
scanf("%d%d",&n,&m);
for(i=0;i<n;i++)
{
scanf("%s",a[i]);
}
r=n>m?m:n;
//第一个数字是min(n,m)
//后面的数字代表0-n的×个数
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
b[is(i,j)]++;
}
}
for(i=1;i<=r;i++)
{
printf("%d ",b[i]);
}
return 0;
}
第二周任务 [Cloned] - Virtual Judge (vjudge.net)
这个题目是一个简单的二分的题目
题目大意是一个字符串都是由01组成,前面全部都是0 ,后面全部都是1,找到0 变成1的那个中介点。
#include<stdio.h>
#define Maxsize 200010
int a[Maxsize];
int main()
{
int n,i,l,r,m,x;
scanf("%d",&n);
l=1,r=n;
for(i=2;i<n;i++)
{
a[i]=-1;
}
a[1]=0;
a[n]=1;
//第1位是0 最后一位是1
//二分查找
while(l<=r)
{
m=(l+r)/2;
printf("? %d\n",m);
fflush(stdout);
scanf("%d",&x);
a[m]=x;
if(a[m]==0)
{
//
if(a[m+1]==1)
{
printf("! %d\n",m);
return 0;
}
else
{
l=m+1;
}
}
else if(a[m]==1)
{
if(a[m-1]==0)
{
printf("! %d\n",m-1);
return 0;
}
else
{
r=m-1;
}
}
}
return 0;
}
第二周任务 [Cloned] - Virtual Judge (vjudge.net)
这个题目的大致意思是 找到最长的连续是o的字串,-ooooo算,ooooo-也算
#include<stdio.h>
#define Maxsize 200100
int MAX(int a,int b)
{
if(a>b) return a;
return b;
}
int main()
{
int n,i,j=0,res=-1;
char str[Maxsize]={0};
scanf("%d",&n);
scanf("%s",str);
for(i=0;i<n;)
{
while(i<n&&str[i]=='o') i++;
if(str[j]=='-')
{
if(j!=i) res=MAX(res,i-j-1);
}
else if(i<n&&str[i]=='-')
{
if(j!=i) res=MAX(res,i-j);
}
while(i<n&&str[i]=='-') i++;
j=i-1;
}
printf("%d\n",res);
return 0;
}
第二周任务 [Cloned] - Virtual Judge (vjudge.net)
这个题目是根据所给的信息构成一个数字,删掉第一个开头的数字,或者添加一位数字在后面,或者查看这个数字。
我们可以用数组去构造一个队列去存储各位数字。另外一个数字存储10、100、100这样的数字,但是需要先求余,不然最后数字会很大,记录这些数字只是为了好操作对于删除第一位数字,到时候只需要用res-对应的位数所指向的10的n次幂就可以了,需要注意的是 十年OI一场空,不开long long见祖宗。
#include<stdio.h>
#include<math.h>
#define Maxsize 600010
#define MOD 998244353
long long a[Maxsize]={0},b[Maxsize]={0};
int main()
{
long long t,i,choose;
long long res=1,l=0,r=1;
a[0]=1;b[0]=1;
for(i=1;i<Maxsize;i++)
{
a[i]=a[i-1]*10%MOD;
}
scanf("%lld",&t);
while(t--)
{
scanf("%lld",&choose);
if(choose==1)
{
scanf("%lld",&i);
res=(res*10+i)%MOD;
b[r++]=i;
// printf("1--%lld\n",res);
}
else if(choose==2)
{
res=((res-a[r-l-1]*b[l])%MOD+MOD)%MOD;
// printf("2--%lld\n",res);
l++;
}
else if(choose==3)
{
printf("%lld\n",res);
}
}
return 0;
}
第二周任务 [Cloned] - Virtual Judge (vjudge.net)
这道题我刚开始想的是直接输出n*n(如果满足的话)
但是最后一个案例过不了,估计是被卡了。
这道题必须要求对应的最小的大于等于M的一个合数,因此就转化成需要找到俩个数字
需要满足俩个条件:a<=b,a*b>=m
那么就可以直接穷举,我们从1-n/2,去穷举a的值,就能推出b的值,那m去除以a,如果有余数就b=m/a+1,然后用res比较得出最小值即可。
#include<stdio.h>
#include<math.h>
#define INF 2e18
unsigned long long MIN(unsigned long long a,unsigned long long b)
{
if(a<b) return a;
return b;
}
int main()
{
unsigned long long n,m,i,j,res=INF;
scanf("%llu%llu",&n,&m);
//1-n的数字要表示至少m
if(n*n<m)
{
puts("-1");
}
else
{
//
for(i=1;i<=n;i++)
{
//直接暴力枚举,算出j的取值
//j=(m+i-1)/i,是为了刚好取到最小值
j=(m+i-1)/i;
if(j<=n) res=MIN(res,i*j);
if(i>j) break;
}
if(res==INF) puts("-1");
else printf("%llu\n",res);
}
return 0;
}
第二周任务 [Cloned] - Virtual Judge (vjudge.net)
这道题用set很容易就做出来了
#include<stdio.h>
#include<set>
#define Maxsize 200010
using namespace std;
set<int> myset;
int a[Maxsize];
int main()
{
int n,m;
int i;
scanf("%d%d",&n,&m);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
myset.insert(a[i]);
}
for(i=0;i<n;i++)
{
if(myset.count(a[i]+m))
{
puts("Yes");
return 0;
}
}
puts("No");
return 0;
}
第二周任务 [Cloned] - Virtual Judge (vjudge.net)
这道题其实是一个计算
计算所有的区间和x值,然后看区间是否对的上,根据区间去计算即可
#include<stdio.h>
#define N 100010
struct node
{
long long x;
long long count;
}a[N][2];
int main()
{
long long l,n1,n2,i,x,y,j,sum,max;
scanf("%lld%lld%lld",&l,&n1,&n2);
for(i=1;i<=n1;i++)
{
scanf("%lld %lld",&a[i][0].x,&a[i][0].count);
a[i][0].count+=a[i-1][0].count;
}
for(i=1;i<=n2;i++)
{
scanf("%lld %lld",&a[i][1].x,&a[i][1].count);
a[i][1].count+=a[i-1][1].count;
}
sum=0;
for(i=1,j=1;i<=n1&&j<=n2;)
{
if(a[i][0].x==a[j][1].x)
{
if(a[i][0].count<a[j][1].count&&a[j-1][1].count<a[i][0].count)
{
if(a[j-1][1].count>a[i-1][0].count)
{
max=a[j-1][1].count;
}
else max=a[i-1][0].count;
sum+=a[i][0].count-max;
i++;
}
else if(a[i][0].count>=a[j][1].count&&a[j][1].count>a[i-1][0].count)
{
if(a[j-1][1].count>a[i-1][0].count)
{
max=a[j-1][1].count;
}
else max=a[i-1][0].count;
sum+=a[j][1].count-max;
j++;
}
else if(a[i][0].count<a[j][1].count)
{
i++;
}
else if(a[i][0].count>=a[j][1].count)
{
j++;
}
}
else if(a[i][0].count<a[j][1].count)
{
i++;
}
else if(a[i][0].count>a[j][1].count) j++;
else
{
i++,j++;
}
}
printf("%lld\n",sum);
}
第二周任务 [Cloned] - Virtual Judge (vjudge.net)
这是一个遍历的题目,直接遍历即可
#include<stdio.h>
#define N 500010
int a[N]={0};
int main()
{
int n,t,i,x,y,j;
int p,q;
p=q=1;
scanf("%d%d",&n,&t);
for(i=1;i<=t;i++)
{
scanf("%d",&x);
if(x==2)
{
scanf("%d",&y);
a[y]=-1;
}
else
{
if(x==1)
{
a[p]=1;
p++;
}
else if(x==3)
{
while(a[q]==-1)
{
q++;
}
printf("%d\n",q);
}
}
}
return 0;
}