java学习
一.正则表达式
定义:正则表达式是一种用于描述字符串模式的表达式,通常被用于文本搜索、匹配和替换。它是一种强大的工具,可以在文本处理和文本分析中进行复杂的匹配和操作。
通过字符串引用里面的方法matches,然后执行匹配功能。
1.
举例:
public static void main(String[] args) {
String t="a";
System.out.println(t.matches("[abc]"));
}
上面代码表示,如果字符串t里面的元素之含[]里面有的,那么就返回真,反之返回假。
public static void main(String[] args) {
String t="p";
System.out.println(t.matches("[abc]"));
}
注意:只能匹配单个字符。
public static void main(String[] args) {
String t="abc";
System.out.println(t.matches("[abc]"));
}
2.
举例:
注意:这里虽然是一个反斜杠,但是我们在写代码时需要两个,这是一个规则。
public static void main(String[] args) {
String t="2";
System.out.println(t.matches("\\d"));
}
2是数字,所以结果应该是真。
但是如果你使用了多字符还是会和上面一样,返回false,因为这个也是匹配单字符的。
3.
举例:
public static void main(String[] args) {
String t="123";
System.out.println(t.matches("[1-9]{3}"));
}
上面是1到9之间的数字刚刚好出现三次。
所以应该返回真。
使用案例:
比如我们需要匹配一个qq好是否合理,我们知道qq号全部是由数字组成,并且第一个数字不能为0,长度在5到10之间。
那么我们就可以用这些信息来写一个匹配。
下面是完成的代码:
public static void main(String[] args) {
String t="12003000";
System.out.println(t.matches("[1-9]\\d{5,10}"));
}
表示第一个数字在1到9之间,后面全部是由数字组成,不包括第一个字符在内后面有4到9个数字,加起来就是限制在5到10个数字。
二.线段树练习题
Sample 1
Inputcopy | Outputcopy |
---|---|
5 5 1 5 4 2 3 2 2 4 1 2 3 2 2 3 4 1 1 5 1 2 1 4 | 11 8 20 |
线段树的入门题,这里就不过多讲解。
AC代码:
#include<iostream>
#include<cstdio>
#define MAXN 1000001
#define ll long long
using namespace std;
unsigned ll n,m,a[MAXN],ans[MAXN<<2],tag[MAXN<<2];
inline ll ls(ll x)
{
return x<<1;
}
inline ll rs(ll x)
{
return x<<1|1;
}
inline void push_up(ll p)
{
ans[p]=ans[ls(p)]+ans[rs(p)];
}
void build(ll p,ll l,ll r)
{
tag[p]=0;
if(l==r){ans[p]=a[l];return ;}
ll mid=(l+r)>>1;
build(ls(p),l,mid);
build(rs(p),mid+1,r);
push_up(p);
}
inline void f(ll p,ll l,ll r,ll k)
{
tag[p]=tag[p]+k;
ans[p]=ans[p]+k*(r-l+1);
}
inline void push_down(ll p,ll l,ll r)
{
ll mid=(l+r)>>1;
f(ls(p),l,mid,tag[p]);
f(rs(p),mid+1,r,tag[p]);
tag[p]=0;
}
inline void update(ll nl,ll nr,ll l,ll r,ll p,ll k)
{
if(nl<=l&&r<=nr)
{
ans[p]+=k*(r-l+1);
tag[p]+=k;
return ;
}
push_down(p,l,r);
ll mid=(l+r)>>1;
if(nl<=mid)update(nl,nr,l,mid,ls(p),k);
if(nr>mid) update(nl,nr,mid+1,r,rs(p),k);
push_up(p);
}
ll query(ll q_x,ll q_y,ll l,ll r,ll p)
{
ll res=0;
if(q_x<=l&&r<=q_y)return ans[p];
ll mid=(l+r)>>1;
push_down(p,l,r);
if(q_x<=mid)res+=query(q_x,q_y,l,mid,ls(p));
if(q_y>mid) res+=query(q_x,q_y,mid+1,r,rs(p));
return res;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
build(1,1,n);
while(m--)
{
int k;
cin>>k;
switch(k)
{
case 1:{
ll l,r,w;
scanf("%lld%lld%lld",&l,&r,&w);
update(l,r,1,n,1,w);
break;
}
case 2:{
ll l,r;
scanf("%lld%lld",&l,&r);
printf("%lld\n",query(l,r,1,n,1));
break;
}
}
}
return 0;
}