来源:蜘蛛抓取(WebSpider)
时间:2016-08-01 04:26
标签:
正则匹配特定字符串
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的会员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
一、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的访问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服务器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&我有想过用遍历字符串的方法,但是貌似不行。。正则表达式不太懂,题目是这样的:现有大量课程信息,数据的格式如下:&&大学英语&&;64教室303李华2-20周讲课学时有几十组这样的数据,数据格式都一样,并且每一组都像例子这样占5行(原数据以String字符串形式存储)。。现在问题是,要求把课程名(大学英语),教室号(教室303),老师名字(李华),上课周数(2-20周) 这四组数据提取出来并且存储以方便以后调用查询。。(剩余的那个数字64和“讲课学时”这几个字删除)问题有点长,请帮看下思路。。我已经懵了
谢邀,题主能贴部分代码么,都是String类型,应该好处理的建议先把不需要的字符串截取掉,然后存到数据库里面
已有帐号?
无法登录?
社交帐号登录梦想破碎是没有声音的,它只是缓慢又沉默地离开了。 by 苏更生
给出一个矩阵,其中每一行和每一列都是有序的,写一个函数在矩阵中找出指定的数。
我们假设这个矩阵每一行都是递增的,每一列也都是递增的,并把这些数据存入文件 9.6.in(如下),其中开头的两个数5 5表示该矩阵是5*5的。
3 7 8 9 11
5 9 10 17 18
7 12 15 19 23
9 13 16 20 25
5 51 2 3 4 53 7 8 9 115 9 10 17 187 12 15 19 239 13 16 20 25&
这个矩阵是有序的,因此我们要利用这一点,当矩阵中元素和要查找的元素对比后, 如果相等,我们返回下标;如果不等,我们就排除掉一些元素,而不仅仅是对比的元素。 我们从矩阵的四个角的元素入手看看,有什么特点。左上角是最小的, 因为矩阵向右是递增的,向下也是递增的。同理,右下角是最大的。让我们来看看右上角, 设要查找的元素为x,比如x比右上角元素5大,那么它也会比第一行的其它元素都大。 因此可以去掉第一行;如果它比右上角元素小,那么它也会比最后一列的元素都小, 因此可以去掉最后一列;然后这样不断地比下去,只需要O(m+n)的时间就查找完。 对于左下角的元素,也有一样的特点。就不再分析了。
代码如下:
#include &iostream&
#include &cstdio&
int d[20][20];
int search(int m, int n, int x){
int r = 0, c = n-1;
while(r&m && c&=0){
if(d[r][c] == x) return (r * n + c);
else if(d[r][c] & x) ++r;
return -1;
int main(){
freopen("9.6.in", "r", stdin);
cin&&m&&n;
for(int i=0; i&m; ++i)
for(int j=0; j&n; ++j)
cin&&d[i][j];
int k = search(m, n, 13);
if(k == -1) cout&&"not found"&&
else cout&&"position: "&&k/n&&" "&&k%n&&
fclose(stdin);
12345678910111213141516171819202122232425262728
#include &iostream&#include &cstdio&using namespace std;&int d[20][20];int search(int m, int n, int x){&&&&int r = 0, c = n-1;&&&&while(r&m && c&=0){&&&&&&&&if(d[r][c] == x) return (r * n + c);&&&&&&&&else if(d[r][c] & x) ++r;&&&&&&&&else --c;&&&&}&&&&return -1;}int main(){&&&&freopen("9.6.in", "r", stdin);&&&&int m, n;&&&&cin&&m&&n;&&&&for(int i=0; i&m; ++i)&&&&&&&&for(int j=0; j&n; ++j)&&&&&&&&&&&&cin&&d[i][j];&&&&&int k = search(m, n, 13);&&&&if(k == -1) cout&&"not found"&&endl;&&&&else cout&&"position: "&&k/n&&" "&&k%n&&endl;&&&&fclose(stdin);&&&&return 0;}
【原文参考】
Assumptions:
>> Rows are sorted left to right in ascending order
Columns are sorted top to bottom in ascending order
>> Matrix is of size MxN
This algorithm works by elimination
Every move to the left (–col) eliminates all the elements below the current cell in that column
Likewise, every move down eliminates all the elements to the left of the cell in that row
boolean FindElem(int[][] mat, int elem, int M, int N) {
int row = 0;
int col = N-1;
while (row & M && col &= 0) {
if (mat[row][col] == elem) {
} else if (mat[row][col] & elem) {
1234567891011121314
&&boolean FindElem(int[][] mat, int elem, int M, int N) {&&&&int row = 0;&&&&int col = N-1; &&&&while (row & M && col &= 0) {&&&&&&if (mat[row][col] == elem) {&&&&&&&&return true;&&&&&&} else if (mat[row][col] & elem) {&&&&&&&&col--;&&&&&&} else {&&&&&&&&row++; &&&&&&}&&&&} &&&&return false; &&}
由【快课教程】编译整理,专注IT教程,打造一站式学习体验。网址:
原作者:Hawstein 出处:/posts/9.6.html
or分享 (0)字符串中数组中如何快速查找?
[问题点数:50分,结帖人fatterbetter]
字符串中数组中如何快速查找?
[问题点数:50分,结帖人fatterbetter]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2011年11月 专题开发/技术/项目大版内专家分月排行榜第一2011年10月 专题开发/技术/项目大版内专家分月排行榜第一2011年9月 专题开发/技术/项目大版内专家分月排行榜第一2011年8月 专题开发/技术/项目大版内专家分月排行榜第一2011年7月 专题开发/技术/项目大版内专家分月排行榜第一2011年6月 C/C++大版内专家分月排行榜第一
2011年7月 C/C++大版内专家分月排行榜第二2011年5月 专题开发/技术/项目大版内专家分月排行榜第二
2013年6月 Linux/Unix社区大版内专家分月排行榜第二2013年5月 Linux/Unix社区大版内专家分月排行榜第二2013年3月 Linux/Unix社区大版内专家分月排行榜第二2013年1月 Linux/Unix社区大版内专家分月排行榜第二2012年12月 Linux/Unix社区大版内专家分月排行榜第二2012年8月 Linux/Unix社区大版内专家分月排行榜第二2011年12月 Linux/Unix社区大版内专家分月排行榜第二2011年10月 C/C++大版内专家分月排行榜第二2011年10月 Linux/Unix社区大版内专家分月排行榜第二
2012年6月 C/C++大版内专家分月排行榜第三2012年6月 PHP大版内专家分月排行榜第三2012年5月 C/C++大版内专家分月排行榜第三2012年3月 Linux/Unix社区大版内专家分月排行榜第三2012年2月 Linux/Unix社区大版内专家分月排行榜第三2011年11月 C/C++大版内专家分月排行榜第三
2013年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第七
本帖子已过去太久远了,不再提供回复功能。面试题精解之二: 字符串、数组(1)
本篇文章发表在下面三个博客中,如果出现排版问题,请移步到另一个博客。
的表,对每个字符hash计数就可以了,但,可能会发生越界访问语言上的一个陷阱,C/C++中的char有三种类型:char、signed char和unsigned char。char类型的符号是由编译器指定的,一般是有符号的。在对字符进行hash时,应该先将字符转为无符号类型,不然,下标为负值时,就会出现越界访问。
数组,记录当前找到的只出现一次的字符,避免对原字符串进行第二次遍历。
&&&&&&&&&&或 UCHAR_MAX + 1
abcabacbcabc
个字符,那么总共要输出2^n –不可能太大,否则的话,以现在CPU的运算速度,程序运行一次可能需要跑几百年、几千年,而且也没有那么大的硬盘来储存运行结果。因而,可以假设n小于一个常数(比如64)。
,尾递归优化后也有2^(n-1))。注意到本题的特点,可以构照一个长度为n的01字符串(或二进制数)表示输出结果中最否包含某个字符,比如:"001"表示输出结果中不含字符a、b,只含c,即输出结果为c,而"101",表示输出结果为ac。原题就是要求输出"001"到"111"这2^n –
size_t len strlen
puts你愿意等我一辈子吗?"
位无符号数表示used数组
size_t idx
一共有2^len – 1个状态
&all_combine_recursive_impl
all_combine_recursive_impl
size_t len strlen
puts你愿意等我一辈子吗?"
all_combine_recursive_impl
的数组,由数字1到n组成,其中数字a不出现,数字b出现两次,其它的数字恰好出现一次,在不修改原数组的情况下,找出数字a和数字b。
①数组中,只有两个数字出现奇数次,其它数字都出现偶数次。假设这两数为a、b。
利用 异或的性质:a xor a = 0&&&&&&&& a xor 0 = a
以及 a xor b = b xor a&& (a xor b) xor c& = a xor (b xor c)
对数组中的所有数进行异或,结果c等于(a xor b)。由于a和b不相乘,因而c不为0,假设c的二进制表示中,第m位不为0。根据第m位是否为0,可以将原数组划分为两块,
显然,a和b不可能分在同一块。由于各块中,只有a或b是奇数次出现的,因而各块所有的数的异或值要么等于a、要么等于b。
标准,为了兼容一补数之类的老古董,正确的写法应该是:
const unsigned tx = *(const unsigned*)(&xor_all);
const unsigned ty = tx & -
const int flag = *(const int*)&
②有三种解法:
&&& 方法一:如果将1到n这n个数也放入数组中,则数字a出现1次,数字b出现3次,可以利用上面的解法,通过两次遍历找出数字c与d,再通过第三次遍历,只遍历原数组,判断数字c是否在原数组中,从而确定c与d,哪个等于a,哪个是等于b。
方法二:对方法一进行改进。在第一次遍历时,额外计算出a与b的差值,利用该信息,可以确定前两次遍历找出的只出现奇数次的两个数,哪个是a、哪个b。
&&&& &&&&方法三:只进行一次遍历,计算出a与b的差c,以及它们间的平方差d,由这两个信息可以直接解得a、b的具体值。
方法一与方法二,在实现中必须计算 0 xor 1 xor 2 xor 3 … xor n,这个有O(1)解法,对偶数a,显然a xor (a + 1) = 1,因而每4个数的异或值为0,即周期为4。同样的,可证明,根据(a xor b)不为0的某一位,把原数组划分两块后,各块每8个数的异或值为0,周期为8。
方法二与方法三,在实现中,比须考虑到计算过程中可能出现的溢出问题。避免溢出最好的方法就是将有符号数转为无符号数,利用“无符号数算术运算是采用模运算,不存在溢出”这个特点。(在32位平台,两个无符号数a、b的和是定义为:(a + b) mod 2^32。)
对方法三的详细解释,可参考本人的文章。
xor_all value
个数(2*k与2*k+1)异或值为1,每4个数的异或值为0,
(其中 arr[4] = {len, 1, len ^ 1 (= len + 1), 0})
个数(8*k到8*k+7),根据某一位是否为1,划为两部分后,每部分的异或值均为0
平台,长度n一定小于2^16次方时,表示一个数的平方值,可采用32位无符号数类型,效率极高。
一定小于2^31次方时,就必须用到64位无符号数类型,效率稍差。
若在[2^31, 2^32)时,表示 所有数的和sum,就必须改用64位无符号数类型,效率很差。&
uint square_sum
square_sum
uint square_difference
difference
square_difference
小题。遇到这类题,首先想到的应该是动态规划思想。(下面的代码中,都假定所进行的有符号数算术运算不会发生溢出。可以通过改用64位整数表些某些数,来保证这点。)
为数组的前n个元素中,以第n个元素结尾的最大连续子序列和,则对第n+1个元素(值为v),只有两种选择: 将该元素放入前n-1的最大连续子序列后、新开一个子序列。
&&。显然 max{ f(i) | i = 1, 2, 3 .. }& 即为所求
cur_max_sum
max_sum&&&&
,从0开始编号,
开始,到下标j(不包括j)结束。
则可以从A点前面断开,问题转为“求普通数组的最大连续子序列和”。
,由于:&& 所有元素和 = i-&j的子序列和 + j-&i的子序列和
的子序列和最大” 等价于求 “j-&i的子序列和最小”。
cur_max_sum
max_sum&&&&
cur_min_sum
min_sum&&&&
&&&&表示数组arr前i个元素的最大不连续子序列和,对第i个数(arr[i-1])只有三种选择:
个元素的最大不连续子序列后、新开一序列。
(个元素的最大不连续子序列后)
(另外,可设f(0) = 0,使f(2)也满足上式)。显然,f(n)即为所求。
prev_max_sum
表示前i个元素中,& 以第i个元素结尾的最大不连续子序列和,
&&&g(i)个元素中,不以第i个元素结尾的最大不连续子序列和,
&&(个元素的最大不连续子序列和)
&g(i) = max(f(i-1), g(i-1))&&&&& &&&&&&&&&&&(i &= 3)
时,max(f(n), g(n)) 即为所求
表示前i个元素中,以第i个元素结尾的最大不连续子序列和,
&&g(i)个元素中,最大不连续子序列和。
&g(i) = max(f(i), g(i-1))&&&&&&&&&&&&&&&&& (i &= 2)
可设g(0) = 0,使f(2)也满足上式)
&&,若从环状数组中任一点,从0开始编号,则结束编号为n-1。由于要保证不连续,编号为0的元素和编号为n-1的元素不能同时取,则对编号为0到n-2和编号为1到n-1的两个子数组分别求最大不连续子序列和,较大的即为所求。具体实现上,可以先求编号为0到n-1的具有最大和的不连续子序列,是否同时包含编号为0和编号为n-1的元素,若不同时包含的话,所得结果即为所求;若同时包含的话,需要再计算编号为1到n-1的子数组的最大不连续子序列和。这需要遍历数组一到二次,下面是只遍历一次的写法:
prev_max_sum2
prev_max_sum1
prev_max_sum2
阅读(...) 评论()