All posts by tracylling

关于变位词

首先判断两个string是否互为变位词。

/*******************************************/
/*decide if two strings are anagrams or not*/
/*******************************************/
/*sort the string*/
bool anagram(string s,string t)
{
	sort(s.begin(),s.end());
	sort(t.begin(),t.end());
	return (s == t);
}

/*Check if the two strings have identical counts for each unique char*/
static bool anagram2(string s,string t)
{
	if(s.length()!=t.length())
		return false;
	int *letters=new int[256](); //()!初始化为0
	int num_unique_chars=0;
	int num_completed_t=0;

	const char *s_array=s.c_str();
	for(int i=0;i<strlen(s_array);++i)
	{
		if(letters[s_array[i]] == 0)
			++num_unique_chars;
		++letters[s_array[i]];
	}
	
	for(int i=0;i<t.length();++i)
	{
		int c=(int)t[i];
		if(letters[c]==0)
		{
			return false;//t中有非s中的新字符
		}
		--letters[c];
		if(letters[c]==0)
		{
			++num_completed_t;//比较完一个字符
			if(num_completed_t==num_unique_chars)
			{
				return i==t.length()-1;//比较完所有字符,t正好处理完
			}
		}
	}
	return false;
}

其次,再来看N多单词的。下次再来补充,今天累了……
参考夏同学的:http://blog.csdn.net/coder_xia/article/details/7550513

linux socket网络编程

套接字是一种网络中进程间通信的方法。网络层的“ip地址”可以唯一标识网络中的主机,而传输层的“协议+端口”可以唯一标识主机中的应用程序(进程)。这样利用三元组(ip地址,协议,端口)就可以标识网络的进程了,网络中的进程通信就可以利用这个标志与其它进程进行交互。
套接字的特性由3个属性确定:
域(domain)——指定套接字通信中使用的网络介质;
类型(type)——分为流套接字(SCOK_STREAM)和数据报套接字(SOCK_DGRAM);
协议(。protocol)——通常使用默认值。 Continue reading

文件系统中的inode

为什么需要inode?
在linux系统中,每个文件不仅有内容数据,还包括文件的各种属性,如所属用户组、所属用户、能否执行、文件建立时间、文件特殊属性等等。由于linux操作系统是一个多用户、多任务的环境,为了保护每个用户所拥有的数据的隐秘性,具有多样化的文件属性在所难免。linux文件系统从ext2开始,将文件属性和文件内容分开存储,分别由indoeblock负责。
将一个分区格式化为ext2时,就必须要指定inode与block的大小,即当分区被格式化为ext2的文件系统时候,它一定胡有inode表与块区域这两个区域。 Continue reading

计数排序

计数排序假设n个输入元素中的每一个都是介于0到k之间的整数,此处k为某个整数。当k=O(n)时,计数排序的运行时间为O(n)。线性复杂度。计数排序不是比较排序算法。稳定算法。

算法思想:对每一个输入元素x,确定出小于x的元素个数。有这个信息后,就可以把x直接放到它在最终输出数组的位置上。
假定输入数组A[1..n],length[A]=n,则存放排序结果的数组B[1..n],临时存储区C[0..k]。 Continue reading

float表示

首先看一段代码:

#include <iostream>
using namespace std;

int main()
{
	int i1 = 5;
	float f1 = i1;
	cout << f1 <<endl;

	int i2 = 37;
	float f2 = *(float*)&i2;
	cout << f2 <<endl;
}

答案输出

由于float在内存中的表示如下:

f1不是原来的5,而是1.25*2的2次方,重新表示成浮点数的形式。
相对于f2,&i取地址变为int*后又转换成float*,再对它进行解引用,所以在同一块内存地址上以float形式读取。所以,37对应的比特位在浮点数的形式上,只能以此计算出.xxxxx的部分,而exp位为0,所以最后计算出的浮点数将为一个奇小无比的数。