如何在矩阵中shell 查找特定字符串的字符串

<!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 (&#8211;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 &#8211;不可能太大,否则的话,以现在CPU的运算速度,程序运行一次可能需要跑几百年、几千年,而且也没有那么大的硬盘来储存运行结果。因而,可以假设n小于一个常数(比如64)。
,尾递归优化后也有2^(n-1))。注意到本题的特点,可以构照一个长度为n的01字符串(或二进制数)表示输出结果中最否包含某个字符,比如:"001"表示输出结果中不含字符a、b,只含c,即输出结果为c,而"101",表示输出结果为ac。原题就是要求输出"001"到"111"这2^n &#8211;
size_t len strlen
puts你愿意等我一辈子吗?"
位无符号数表示used数组
size_t idx
一共有2^len &#8211; 1个状态
&all_combine_recursive_impl
all_combine_recursive_impl
size_t len strlen
puts你愿意等我一辈子吗?"
all_combine_recursive_impl
的数组,由数字1到n组成,其中数字a不出现,数字b出现两次,其它的数字恰好出现一次,在不修改原数组的情况下,找出数字a和数字b。
&#9312;数组中,只有两个数字出现奇数次,其它数字都出现偶数次。假设这两数为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*)&
&#9313;有三种解法:
&&& 方法一:如果将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 &#8230; xor n,这个有O(1)解法,对偶数a,显然a xor (a + 1) = 1,因而每4个数的异或值为0,即周期为4。同样的,可证明,根据(a xor b)不为0的某一位,把原数组划分两块后,各块每8个数的异或值为0,周期为8。
方法二与方法三,在实现中,比须考虑到计算过程中可能出现的溢出问题。避免溢出最好的方法就是将有符号数转为无符号数,利用&#8220;无符号数算术运算是采用模运算,不存在溢出&#8221;这个特点。(在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点前面断开,问题转为&#8220;求普通数组的最大连续子序列和&#8221;。
,由于:&& 所有元素和 = i-&j的子序列和 + j-&i的子序列和
的子序列和最大&#8221; 等价于求 &#8220;j-&i的子序列和最小&#8221;。
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
阅读(...) 评论()

我要回帖

更多关于 正则匹配特定字符串 的文章

 

随机推荐