精华内容
下载资源
问答
  • 首先要明确,虽然有三种前缀(无前缀前缀u,前缀b),但是字符串的类型只有两种(str,bytes),实验如下: 根据程序以及以上运行结果,发现无前缀,和前缀u,构造出来的字符串常量,是一样的。类型一样是str,...

    假设读者已经了解了什么叫字符集,什么叫编码,什么叫解码。

    首先要明确,虽然有三种前缀(无前缀,前缀u,前缀b),但是字符串的类型只有两种(str,bytes),实验如下:

                 

    根据程序以及以上运行结果,发现无前缀,和前缀u,构造出来的字符串常量,是一样的。

    类型一样是str,长度一样是3,==判断也是返回true。is判断也是返回true。

    其实,这里是因为,python3中,字符串的存储方式都是以Unicode字符来存储的,所以前缀带不带u,其实都一样。

    结论:字符串常量,前缀带不带u,都是一样的

     

    不管是utf-8,还是gbk,都可以理解为一种对应关系(若干个十六进制数<——>某个字符):

          

    所以可以发现任何str类型的字符串,在经过encode('utf-8')后,就是通过utf-8这种编码解码方式(两种方向),将Unicode字符转换为对应的以字节方式存储的若干十六进制数。

    根据如上程序以及结果,可以发现,utf-8用三个字节(6个十六进制数)来表示一个中文字符,而gbk用两个字节(4个十六进制数)来表示一个中文字符。

    结论:encode()函数根据括号内的编码方式,把str类型的字符串转换为bytes字符串,字符对应的若干十六进制数,根据编码方式决定

     

    既然知道了,str实际存储的是Unicode字符,那么也可以Unicode编码来存储str,形如\u1234:

    发现\u后面跟四个十六进制数,就可以代表一个Unicode字符,同样的,前缀带不带u都一样。

         

    结论:str类型的字符串,每个字符用字符本身或者\u1234,来表示都可以,后者则是直接是Unicode编码。但打印时都是打印字符本身

     

    bytes字符串的组成形式,必须是十六进制数,或者ASCII字符:

    提示错误:bytes只能包含ASCII字符。

    在打印bytes字符串时,某些正常字符和一些转义字符可以打印出来,比如:字母数字和‘\n’换行符。别的就只能以原来的方式存在。

    还可以对bytes取索引,所以这里bytes也可以用for循环来迭代了,因为也是可迭代对象。

    取索引,将所在元素的数,转换为十进制数。

    代码:

    oath = '我爱妞'
    print(type(oath))
    print(len(oath))
    
    oath1 = u'我爱妞'
    print(type(oath1))
    print(len(oath1))
    
    print(oath==oath1)
    
    
    utf8 = oath.encode('utf-8')
    print(type(utf8))
    print(len(utf8))
    print(utf8)
    
    gbk = oath.encode('gbk')
    print(type(gbk))
    print(len(gbk))
    print(gbk)
    
    
    out = open('test.txt','w',encoding = 'utf-8')
    
    test = u'\u5220\u9664'
    print(len(test))
    print(test)
    test1 = test.encode('utf-8')
    print(test1)
    print(type(test1))
    
    out.write(test)
    out.close()
    

     

    展开全文
  • select group_concat(m separator ';') DROP_sql from (Select CONCAT( 'drop table ', table_name, '' ) m FROM information_schema.tables Where table_name LIKE 'pms_%') a
  • nginx反向代理配置去除前缀

    万次阅读 多人点赞 2019-01-07 00:13:28
    表示匹配前缀是 user 的请求, proxy_pass 的结尾有 / , 则会把 /user/* 后面的路径直接拼接到后面,即移除 user 。 方法二:rewrite upstream user { server localhost:8089 weight=5; } upstream order { ...

    使用nginx做反向代理的时候,可以简单的直接把请求原封不动的转发给下一个服务。设置proxy_pass请求只会替换域名,如果要根据不同的url后缀来访问不同的服务,则需要通过如下方法:

    方法一:加"/"

    server {
        listen              8000;
        server_name         abc.com;
        access_log  "pipe:rollback /data/log/nginx/access.log interval=1d baknum=7 maxsize=1G"  main;
    
        location ^~/user/ {
            proxy_set_header Host $host;
            proxy_set_header  X-Real-IP        $remote_addr;
            proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
            proxy_set_header X-NginX-Proxy true;
    
            proxy_pass http://user/;
        }
    
        location ^~/order/ {
            proxy_set_header Host $host;
            proxy_set_header  X-Real-IP        $remote_addr;
            proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
            proxy_set_header X-NginX-Proxy true;
    
            proxy_pass http://order/;
        }
    }
    

    ^~/user/表示匹配前缀是user的请求,proxy_pass的结尾有/, 则会把/user/*后面的路径直接拼接到后面,即移除user

    方法二:rewrite

    upstream user {
      server localhost:8089 weight=5;
    }
    upstream order {
      server localhost:8090 weight=5;
    }
    
    server {
        listen              80;
        server_name  abc.com;
        access_log  "pipe:rollback /data/log/nginx/access.log interval=1d baknum=7 maxsize=1G"  main;
    
        location ^~/user/ {
            proxy_set_header Host $host;
            proxy_set_header  X-Real-IP        $remote_addr;
            proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
            proxy_set_header X-NginX-Proxy true;
    
            rewrite ^/user/(.*)$ /$1 break;
            proxy_pass http://user;
        }
    
        location ^~/order/ {
            proxy_set_header Host $host;
            proxy_set_header  X-Real-IP        $remote_addr;
            proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
            proxy_set_header X-NginX-Proxy true;
    
            rewrite ^/order/(.*)$ /$1 break;
            proxy_pass http://order;
        }
    }
    

    proxy_pass结尾没有/rewrite重写了url。

    参考资料1

    展开全文
  • 前缀和、二维前缀和与差分的小总结

    万次阅读 多人点赞 2018-08-17 16:21:35
    在了解二维前缀和之前,我们首先需要了解一下什么是前缀和。 如果我给你一串长度为n的数列a1,a2,a3......an,再给出m个询问,每次询问给出L,R两个数,要求给出区间[L,R]里的数的和,你会怎么做,若是没有了解过前缀...

    在了解二维前缀和之前,我们首先需要了解一下什么是前缀和。

    如果我给你一串长度为n的数列a1,a2,a3......an,再给出m个询问,每次询问给出L,R两个数,要求给出区间[L,R]里的数的和,你会怎么做,若是没有了解过前缀和的人看到这道题的想法可能是对于m次询问,我每次都遍历一遍它给的区间,计算出答案,这样子的方法固然没错,但是其时间复杂度达到了O(n*m),如果数据量稍微大一点就有可能超时,而我们如果使用前缀和的方法来做的话就能够将时间复杂度降到O(n+m),大大节省了运算时间。至于怎么用,请看下面一小段代码

    a[0]=0;
    
    for(int i=1;i<=n;i++)a[i]+=a[i-1];

    没错,前缀和顾名思义就是前面i个数的总和。数组a在经过这样的操作之后,对于每次的询问,我们只需要计算a[R]-a[L-1]就能得到我们想要的答案了,是不是很简单呢。

    在知道了最简单的前缀和之后,我们再来了解一下什么是差分。

    给你一串长度为n的数列a1,a2,a3......an,要求对a[L]~a[R]进行m次操作:

    操作一:将a[L]~a[R]内的元素都加上P

    操作二:将a[L]~a[R]内的元素都减去P

    最后再给出一个询问求a[L]-a[R]内的元素之和?

    你会怎么做呢?你可能会想,我对于m次操作每次都遍历一遍a[L]~a[R],给区间里的数都加上P或减去P,最后再求一次前缀和就行了。没错,这样子确实也能得出正确答案,但时间复杂度却高达O(M*n),对于1<=n,m<=1e5这个数据范围来说直接就tle了,所以说这个方法不可行。既然这样不行的话,那我们要怎么做才能快速的得到正确答案呢?是的,这个时候我们的差分就该派上用场了,我们新开一个数组b,储存每一次的修改操作,最后求前缀和的时候统计一下就能快速的得到正确答案了,详细请看下面代码。

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=1e5+9;
    int a[maxn],b[maxn];
    int main(){
    	int i,j,k,n,m,p;
    	cin>>n>>m;
    	for(i=1;i<=n;i++){
    		cin>>a[i];
    	}
    	for(i=1;i<=m;i++){
    		int L,R,t;
    		cin>>t>>L>>R>>p;
    		if(t==1){
    			b[L]+=p;b[R+1]-=p; //仔细想想为什么b[R+1]要减去p 
    		}
    		else{
    			b[L]-=p;b[R+1]+=p;
    		}
    	}
    	int add=0;
    	for(i=1;i<=n;i++){
    		add+=b[i];
    		a[i]+=a[i-1]+add;
    	}
    	int x,y;
    	cin>>x>>y;
    	cout<<a[y]-a[x-1]<<endl;
    }

    相信看到这里,大家已经仔细思考过代码了,为什么操作一时b[R+1]要减去p,很简单,因为操作一我只需对[L,R]区间里的数加p,[R+1,n]这个区间里的数没必要加p,所以需要减掉p。

    差分讲解完毕,接下来我们终于要开始今天的正题——二维前缀和了。

    还是以小问题的形式来讲解二维前缀和吧。

    给定一个n*m大小的矩阵a,有q次询问,每次询问给定x1,y1,x2,y2四个数,求以(x1,y1)为左上角坐标和(x2,y2)为右下角坐标的子矩阵的所有元素和。注意仍然包含左上角和右下角的元素。

    怎么做呢?为了方便你们理解,我画个图吧。

    图画的很丑,希望不要介意。如图所示,按题目要求,我们每次要求的答案就是红色圆圈所在的区域的值(注意,这里的x1,x2表示行,y1,y2表示列),对比上面这张图我们能够发现红色区域的值等于四个区域的值减去(白色区域+黑色区域),再减去(白色区域+蓝色区域),最后因为白色区域被减了两次,我们需要再加回来。所以ans=a[x2][y2]-a[x1-1][y2]-a[x2][y1-1]+a[x1-1][y1-1];(注意,此时的a数组代表的是前缀和)。突然想起来还没说怎么求二维前缀和,很简单,看下面代码。

    for(int i=1;i<=n;i++){
    	for(int j=1;j<=m;j++)
    	a[i][j]+=a[i][j-1]+a[i-1][j]-a[i-1][j-1];
    } 

    为方便理解贴个图

    假如我想求a[2][4]的前缀和,我得先加上a[1][4]的前缀和,再加上a[2][3]的前缀和,然后这个时候我们发现实际上a[1][3]这个部分我们加了两遍,所以我们需要再减去一遍a[1][3],于是得出公式a[i][j]+=a[i][j-1]+a[i-1][j]-a[i-1][j-1]

    接下来看完整代码吧。

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=1e3+9;
    int a[maxn][maxn];
    int main(){
    	int i,j,k,n,m,q;
    	cin>>n>>m>>q;
    	for(i=1;i<=n;i++){
    		for(j=1;j<=m;j++)
    		cin>>a[i][j];
    	}
    	for(i=1;i<=n;i++){
    		for(j=1;j<=m;j++)
    		a[i][j]+=a[i][j-1]+a[i-1][j]-a[i-1][j-1];
    	}
    	for(i=1;i<=q;i++){
    		int x1,y1,x2,y2;
    		cin>>x1>>y1>>x2>>y2;
    		int ans=a[x2][y2]-a[x1-1][y2]-a[x2][y1-1]+a[x1-1][y1-1];
    		cout<<ans<<endl;
    	}
    }

    是不是感觉很简单呢,哈哈哈哈哈哈哈。

    在学完二维前缀和之后,一些同学可能会有疑问,一维前缀和能用上差分,那么二维前缀和能不能用上差分呢?答案是肯定的。

    那么怎么差分呢?方法是和一维类似的,我们也是需要另开一个数组记录修改操作,最后求前缀和时统计修改操作,只是二维每一次操作需要记录4个位置,一维只需要记录2个位置。具体怎么做,看下面代码吧。

    for(int i=0;i<m;i++){//m是修改操作次数 
    	int x1,y1,x2,y2,p;
    	cin>>x1>>y1>>x2>>y2>>p;
    	b[x1][y1]+=p;b[x2+1][y2+1]+=p;
    	b[x2+1][y1]-=p;b[x1][y2+1]-=p;
    }

    好了,一维前缀和、二维前缀和、差分都说完了,希望看这篇文章的人能够有所收获吧。

    展开全文
  • 前缀和——(1)什么是前缀和和一维前缀

    千次阅读 多人点赞 2019-12-13 12:32:40
    什么是前缀前缀和(Prefix Sum)的定义为:对于一个给定的数列 A, 它的前缀和数列 S 是通过递推能求出来得 部分和。 例如: C++实现 //假设数组a和前缀和数组s都已经定义 int i; //初始条件 a[0] = 0; s[0...

    什么是前缀和

    前缀和(Prefix Sum)的定义为:对于一个给定的数列 A, 它的前缀和数列 S 是通过递推能求出来得 S[i] = \sum_{j = 1}^{i}A[j]  部分和。

    例如:

    A[5, 6, 7, 8] = PrefixSum[5, 11, 18, 26]\\ PrefixSum[0] = A[0]\\ PrefixSum[1] = A[0] + A[1]\\ PrefixSum[2] = A[0] + A[1] + A[2]\\ PrefixSum[3] = A[0] + A[1] + A[2] + A[3]\\ ...\\ PrefixSum[n] = A[0] + A[1] + A[2] + A[3] + ... + A[n]

    C++实现

    //假设数组a和前缀和数组s都已经定义
    int i;
    //初始条件
    a[0] = 0;
    s[0] = 0;
    for (i=1; i<=n; i++) {
        cin >> a[i];
        s[i] = s[i-1] + a[i];
    }

    模板题

    下面我们用一个模板题,将完整的一维数组前缀和做一个简单的展示。题目链接http://47.110.135.197/problem.php?id=5181

    #include <bits/stdc++.h>
    
    using namespace std;
    
    int main() {
    	int n;
    	cin >> n;
    	
    	int data;
    	int ans[102] = {};
    	for (int i=1; i<=n; i++) {
    		cin >> data;
    		ans[i] = ans[i-1] + data;
    	}
    	
    	for (int i=1; i<=n; i++) {
    		cout << ans[i] << " ";
    	}
    	cout << endl;
    	
    	return 0;
    }

    用途

    前缀和是一种重要的预处理,能大大降低查询的时间复杂度。

    前缀和是以求和的方式灵活地面对区间询问。

    下面我们用一个模板题来说明。

    例题:区间求和

    给你一串长度为 n 的数列 a1, a2, a3, ..., an,再给出 m 个询问,每次询问给出 L, R 两个数,要求给出区间 [L, R] 里的数的和。

    详细可以参看http://47.110.135.197/problem.php?id=5139

    题目分析

    题目非常简单,我们也可以得到一个最简单的解法,暴力操作。也就是对应每个询问,我们都从 L 开始到 R 结束对这个区间的数据进行求和。基本的代码如下:

    #include <iostream>
    
    using namespace std;
    
    const int MAXN = 1e5+2;
    long long arr[MAXN] = {};
    
    int main() {
        int n;
        cin >> n;
        
        int i, j;
        for (i=1; i<=n; i++) {
            cin >> arr[i];
        }
    
        int m;
        int l, r;
        long long ans = 0;
        cin >> m;
        for (i=0; i<m; i++) {
            cin >> l >> r;
    
            ans = 0;
            for (j=l; j<=r; j++) {
                ans += arr[j];
            }
    
            cout << ans << endl;
        }
    
        return 0;
    }

    代码分析

    从上面的代码非常明确的分析出来,代码的时间复杂度为 O(n * m)。也就是说,在比赛中这样的解法能否 AC,那就要看数据的量了。当然我们都知道这样的解法,比赛中是肯定不可能 AC。因此唯一的可能就是降低时间复杂度。方法就是使用前缀和。

    我们先看前缀和的数学。数列A中某个下标区间 [l, r] 内的数的和定义为:

    sum[l, r] = \sum_{i = l}^{r}A[i]\\ = a[l] + a[l+1] + \cdots + a[r]\\ = S[r] - S[l-1]

    从上面推导,我们可以清晰的看出,前缀和和区间和的关系。

    代码改进

    #include <iostream>
    
    using namespace std;
    
    const int MAXN = 1e5+2;
    long long arr[MAXN] = {};
    long long sum[MAXN] = {};
    
    int main() {
        int n;
        cin >> n;
        
        int i, j;
        for (i=1; i<=n; i++) {
            cin >> arr[i];
            sum[i] = sum[i-1] + arr[i];
        }
    
        int m;
        int l, r;
        cin >> m;
        for (i=0; i<m; i++) {
            cin >> l >> r;
            cout << sum[r] - sum[l-1] << endl;
        }
    
        return 0;
    }

    代码分析

    从上面的代码非常明确的分析出来,代码的时间复杂度为 O(n)

    展开全文
  • 关于前缀前缀

    2018-08-11 20:26:32
    前缀: 如一个序列:1,2,3,4,5,6,那么5的前缀:1;1,2;1,2,3;1,2,3,4; 即第一个元素到该元素前面的那个元素为止; 前缀和 还是上面的序列,那么5的前缀和:1+2+3+4=10;即该数前所有数的和; 求某个数...
  • 前缀

    千次阅读 多人点赞 2020-03-12 15:40:25
    前缀和】 什么是前缀和?前缀和是一个数组的某项下标之前(包括此项元素)的所有数组元素的和。 设b[]为前缀和数组,a[]为原数组,根据这句话可以得到前缀和的定义式和递推式: 定义式 递推式 一维前缀...
  • 前缀索引

    2021-05-06 10:46:32
    什么是前缀索引? 前缀索引也叫局部索引,比如给身份证的前 10 位添加索引,类似这种给某列部分信息添加索引的方式叫做前缀索引。 为什么要用前缀索引? 前缀索引能有效减小索引文件的大小,让每个索引页可以...
  • 前缀

    千次阅读 多人点赞 2018-10-18 10:24:12
    它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。 字典树又称为前缀树或Trie树,是处理字符串常见的数据结构。假设组成所有单词的字符仅是“a”~"z&...
  • 进制前缀

    千次阅读 2017-03-30 10:17:58
    进制前缀
  • 前缀

    2017-03-24 18:16:34
    前缀
  • 前缀和是一种重要的预处理,能大大降低查询的时间复杂度。 【一维前缀和】 给定一个数组A[1,2,……n],则它的前缀和数组为PrefixSum[1..n]。定义为:PrefixSum[i] = A[0]+A[1]+...+A[i-1]; 【例子】 A[5,6,7,8]...
  • 参考文章1:【python】python字符串前面加u,r,b的含义 参考文章2:python3 三种字符串(无前缀前缀u,前缀b)与encode()
  • 【LeetCode】﹝前缀和ி﹞一维、二维前缀和应用

    千次阅读 多人点赞 2021-05-31 09:12:12
    【LeetCode】﹝前缀和ி﹞一维、二维前缀和应用 文章目录【LeetCode】﹝前缀和ி﹞一维、二维前缀和应用在区间范围内统计奇数数目★区域和检索 - 数组不可变★★子数组异或查询★★定长子串中元音的最大数目★★生存...
  • 浏览器私有前缀

    2018-02-25 21:03:37
    浏览器私有前缀CSS3 规范从启动到成为W3C 的推荐标准,一般要经历数年。在W3C 开发标准的过程中,浏览器通常会提前实现这些特性。浏览器厂商通常都是在属性名称前添加厂商的私有前缀,来测试这些尚未成为标准的特性...
  • 前缀长度

    2019-02-20 16:53:30
    在MySQL中,前缀长度最大值为255字节。对于存储引擎为MyISAM或InnoDB的数据表,前缀最长为1000字节。 在MySQL中,对于TEXT和BLOB这种大数据类型的字段,必须给出前缀长度(length)才能成功创建索引。 办法: 可以...
  • 最短前缀

    2017-01-16 06:25:59
    一个字符串的前缀是从该字符串的第一个字符起始的一个子串。例如 "carbon"的字串是: "c", "ca", "car", "carb", "carbo", 和 "carbon"。注意到这里我们不认为空串是字串, 但是每个非空串是它自身的字串. 我们现在...
  • 前缀和——(3)树上前缀

    千次阅读 2020-01-01 20:49:24
    前面部分我们介绍了一维前缀和...下面我们简单介绍一下树上前缀和。 什么是树上前缀和 假设表示结点 i 到根节点的权值总和。 然后若是点权,路径上的和为; 否...
  • 字典树(前缀树)

    万次阅读 多人点赞 2018-08-24 00:41:07
    前缀树更容易理解 字典树的样子 Trie又被称为前缀树、字典树,所以当然是一棵树。上面这棵Trie树包含的字符串集合是{in, inn, int, tea, ten, to}。每个节点的编号是我们为了描述方便加上去的。树中的每一条...
  • 前缀和——(2)二维数组前缀

    千次阅读 2019-12-30 09:54:42
    下面我们扩展一下,来介绍二维前缀和。 什么是二维前缀和 比如我们有这样一个矩阵a,如下所示: 1 2 4 3 5 1 2 4 6 3 5 9 我们定义一个矩阵sum,其中,那么这个矩阵就是这样的: 1 3 7 10 6 9 15 22...
  • 英语前缀总结

    万次阅读 2017-07-27 19:46:26
    常见的前缀 1. 表示否定意义的前缀 1) 纯否定前缀 a- ,an- , asymmetry (不对称) anhydrous (无水的) Dis- dishonest,dislike In-,ig-,il,im,ir,incapable,inability,ignoble,impossible,immoral...
  • c++ 前缀 变量命名 如果您是第一次查看Takes或Cactoos的源代码,很可能会像其他命名约定一样被命名约定触发,这意味着大多数类名都有两个字母的前缀: BkSafe , RqFake , RsWithStatus , TkGzip等。 老实说,我...
  • Prefixes前缀

    2016-07-27 22:37:57
     最多四个前缀,每个前缀只有1个字节,前缀间先后顺序无关,可以没有任何前缀  — Lock and repeat prefixes: • F0H—LOCK. • F2H—REPNE/REPNZ (used only with string instructions). • F3H—REP (use ...
  • 文章目录说明完整前缀(138个)常用前缀 说明 个人拙见:单词基本上都是由前缀词根后缀然后结合词性组成,所以,只要花大量时间死记硬背的吧前缀词根后缀都背熟以后,结合词性翻译或使用该单词,效率比直接被单词或 ...
  • win 10 设置静态ip 子网前缀长度

    万次阅读 2019-07-03 12:44:46
    如果是255.255.255.0那么子网前缀就是24 计算方法:255转换为二进制数为8个1长度就是8 如果是255.255.255.255 就是4个8 子网前缀长度就是32 如果是255.255.255.0 就是3个8 子网前缀长度就是24 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 799,452
精华内容 319,780
关键字:

前缀