100-90

1.不开辟用于交换数据的临时空间,如何完成字符串的逆序
(在技术一轮面试中,有些面试官会这样问)。
2.删除串中指定的字符
(做此题时,千万不要开辟新空间,否则面试官可能认为你不适合做嵌入式开发)

3.判断单链表中是否存在环。

思路:

1.这道题的关键是解决怎么不借用额外的空间来交换两个变量,这里面的技巧是采用异或的方式,相同的变量异或结果为1,任何变量同1异或结果不变。

void change(char *first,char *second){
	*first = *first ^ *second;
	*second = *first ^ *second;
	*first = *first ^ *second;
}

void reversed(char *index,char size){
	if(size <= 1){
		return ;
	}
	for(int i = 0 ; i < size / 2 ; ++i){
		change(index+i,index+size-1-i);
	}
}
2. 删除串中指定的字符,这样的题目应该就是顺序扫描字符串,直到找到要删除的字符,然后接下来依次复制后面的一个元素覆盖当前元素就可以了。到最后一个元素的时侯释放,或者怎么操作无所谓了。

void delIndex(char *index,int size,char pattern){
	if(size <= 0){
		cout << "index is empty!" << endl;
		return ;
	}
	int pIndex = 0;
	while(index[pIndex] != pattern){
		++pIndex;
		if(pIndex == size){
			cout << "can't match the pattern!" << endl;
			return ;
		}
	}
	while(pIndex < size-1){
		index[pIndex] = index[pIndex+1];
		++pIndex;
	}
	index[pIndex] = '\0';
}
3.老题了。。两个指针,一个一次走一个节点,另一个一次走两个节点。如果什么时候两个指针指向同一个节点就说明链表有环,如果遇到某个指针为空,则说明链表没有环。

bool hasLoop(slist * head){
    slist * slow = head , * fast = head;
    while( fast && fast -> next ){
        slow = slow -> next;
        fast = fast -> next -> next;
        if ( slow == fast ) break ;
    }
    return ! (fast == NULL || fast -> next == NULL);
}


你可能感兴趣的:(100-90)