Chapter 1 笔记 数组和字符串

1.1 对字符串的字符作统计

作统计,需要辅助空间,越省越好。判断有没有重复的字符(每种字符用1bit即可),也可以判断出现次数最多的字符(每种字符用一个unsigned int)。


下面是统计是否有重复字符。

int isUniqueChar(String str)
{
	int checker = 0; //32位int型足够存下26个字符
	for(int i=0;i<str.length();i++)
	{
		int idx = str[i] - 'a';//字符转换为序号
		if( (checker & (1<<idx)) > 0) //重复出现
			return false;
		else
			checker |= (1<<idx); //标记为出现
	}
	return true;
}


1.2  字符串逆置

# include<cstdio>
# include<iostream>

void main()
{
	char a[] = "abcdefg";
	printf("%s\n",a);

	char *str = a;
	char *end = str;
	if(str)
	{
		while(*end)
			end++;
		end--;
		while(end > str)
		{
			*end = *end ^ *str;
			*str = *end ^ *str;
			*end = *end ^ *str; 
			end--;//交换完之后指针往中间移动
			str++;
		}
	}

	printf("%s\n",a);
}


1.3 去除字符串中的重复字符

新字符串和老字符串其实是同一个空间,只是指针位置不同(老串的尾指针扫描的快,新串的尾指针右移的比较慢)

void remvoeDuplicateChar(char *str){
	if(str == NULL)
		return;
	int len = str.length();
	if(len<2) 
		return;

	bool[] hit = new bool[256];//可记录256种字符
	for(int i=0;i<len;i++)
		hit[i] = 0;

	hit[str[0]] = 1;
	int tail = 1; //字符串的新结尾

	for(int i = 1; i<len; i++)
	{
		if(!hit[str[i]]){ //如果是没有出现过的字符,则追加进来,并标记1
			str[tail] = str[i];
			tail++;
			hit[str[i]] = 1;
		}
	}
	str[tail] = '\0';//终结新串

}

1.5  替换空格 

参见 http://blog.csdn.net/luckyjoy521/article/details/9311557



1.7 矩阵中,有一个元素为0,则将该行和该列的元素都置为0

如果只遍历一次,遇到0就把该行该列置0,那么肯定就把整个矩阵变成0了。所以必须要遍历两次。

void setZeros(int[][] matrix)
{
	int[] row = new int[matrix.length];
	int[] column = new int[matrix[0].length];

	//先全部统计好
	for(int i=0;i<matrix.length;i++){
		for(int j=0;j<matrix[0];j++)
		{
			if(matrix[i][j]==0){
				row[i]=1;
				column[j]=1;
			}
		}
	}

	//再做处理
	for(int i=0;i<matrix.length;i++)
		for(int j=0;j<matrix[0].length;j++){
			if(row[i]==1 || column[j]==1)
				matrix[i][j]=0;
		}
}



1.8 用isSubstring()函数来判断两个字符串是不是可以循环移动转换的。

**特性:一个字符串A进行若干次循环移动变为B,如abcde变成cdeab。那么B一定是AA的子串。abcdeabcde。

反过来,对于一个字符串A,如果另一个字符串B是AA的子串,并且A和B的长度相同,那么A进行若干次循环移动可以变为B。

int isRotation(String s1, String s2)
{
	int len1 = s1.length();
	int len2 = s2.length();

	if(len1 != len2)
		return 0;

	String tmp = s1 + s1;
	if(isSubstring(tmp, s2))
		return 1;
	else
		return 0;
}






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值