把字符串中*全部移到字符串的头部---要求时间复杂度和空间复杂度
2011-10-08 12:03
267 查看
#include <stdio.h> //把字符串中*全部移到字符串的头部 void moveCharToHead(char *str) { if(str == NULL) return ; char *pString = str; char *tmp = NULL; while(*pString != '\0') { if(*pString == '*') { tmp = pString; while(tmp > str) { *tmp = *(tmp - 1); tmp --; } *tmp = '*'; str ++; } pString ++; } } int main() { char str[] = "*th*an*k* yo*u *v*er*y* m**uc*h !"; int len = sizeof(str) / sizeof(char); moveCharToHead(str); printf("%s\n",str); }
数组中,数值移动问题.
如下:
int A[nSize],其中隐藏着若干0,其余非0整数,写一个函数int Func(int* A, int nSize),使A把0移至后面,非0整数移至
数组前面并保持有序,返回值为原数据中第一个元素为0的下标。(尽可能不使用辅助空间且考虑效率及异常问题,注释规范且给出设计思路)
#include <stdio.h> int Func(int* A, int nSize) { int tag = 0,nCount = 0; int *p = NULL,*tmp = NULL; if((A == NULL) || (nSize <= 0)) { return -1; } while(nCount < nSize) { if(A[ nCount ] == 0) { tag = 1; break; } else { nCount ++; } } if(tag == 1) { p = A + nCount; while(p < A + nSize) { if(*p == 0) { tmp = p; tag = *p; while(tmp < A + nSize) { *tmp = *(tmp + 1); tmp ++; } nSize --; *(A + nSize) = tag; } else { p ++; } } return nCount; } else { printf("Donnot find the zero.\n"); return -1; } } int main() { int A[] = {0,8,0,7,6,5,0,3,2,0,1,0,8,0,9}; int i,len = sizeof(A) / sizeof(int); Func(A,len); for(i = 0;i < len;i ++) { printf("%3d",A[i]); } printf("\n"); }
好的算法:
void DeleteChars(char* pStrSource, const char* pStrDelete) { if(NULL == pStrSource || NULL == pStrDelete) return; const unsigned int nTableSize = 256; int hashTable[nTableSize]; memset(hashTable, 0, sizeof(hashTable)); const char* pTemp = pStrDelete; while ('\0' != *pTemp) { hashTable[*pTemp] = 1; ++ pTemp; } char* pSlow = pStrSource; char* pFast = pStrSource; while ('\0' != *pFast) { if(1 != hashTable[*pFast]) { *pSlow = *pFast; ++ pSlow; } ++pFast; } *pSlow = '\0'; }
相关文章推荐
- 查找一个字符串中第一个只出现两次的字符。比如:“abcdefabcdefabc”中第一个只出现两次为‘d’,要求时间复杂度为O(N),空间复杂度为O(1)
- 动态规划求数组中和最大字串的值 以及 字符串的循环移位(要求空间复杂度O(1),时间复杂度O(n))
- 【每日一题】查找一个字符串中第一个只出现两次的字符。要求时间复杂度为O(N),空间复杂度为O(1)
- 查找字符个数--查找一个字符串中第一个只出现两次的字符。比如:“abcdefabcdefabc”中第一个只出现两次为‘d’,要求时间复杂度为O(N),空间复杂度为O(1)
- 查找一个字符串中第一个只出现两次的字符。比如:“abcdefabcdefabc”中第一个只出现两次为‘d’,要求时间复杂度为O(N),空间复杂度为O(1)
- 【字符串】查找一个字符串中第一个只出现两次的字符。比如:“abcdefabcdefabc”中第一个只出现两次为‘d’,要求时间复杂度为O(N),空间复杂度为O(1)
- 一个整型数组里除了一个数字之外,其他的数字都出现了两次。要求时间复杂度是O(n),空间复杂度是O(1),如何找出数组中只出现一次的数字
- 字符串移动(字符串为*号和26个字母的任意组合,把*号都移动到最左侧,把字母移到最右侧并保持相对顺序不变),要求时间和空间复杂度最小
- 百度笔试:给定一个存放整数的数组,重新排列数组使得数组左边为奇数,右边为偶数。 要求:空间复杂度O(1),时间复杂度为O(n)
- 字符串移动(字符串为’*’号和26个字母的任意组合, 把’*’号都移动到最左侧,把字母移到最右侧并保持相对顺序不变),要求时间和空间复杂度最小
- 一个整型数组里除了一个或者两个或者三个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)
- 【百度】写一个字符串逆序的程序,时间复杂度和空间复杂度最低,效率越高越好
- 字符串移动(字符串为*号和26个字母的任意组合,把*号都移动到最左侧,把字母移到最右侧并保持相对顺序不变),要求时间和空间复杂度最小 .
- 【百度】写一个字符串逆序的程序,时间复杂度和空间复杂度最低,效率越高越好
- 一个整型数组里除了一个或者两个或者三个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)
- 找出一个数组中出现次数超过一半的那个数字,要求时间复杂度O(n)和空间复杂度为O(1)。
- 对于一颗完全二叉树,要求给所有节点加上一个pNext指针,指向同一层的相邻节点;如果当前节点已经是该层的最后一个节点,则将pNext指针指向NULL;给出程序实现,并分析时间复杂度和空间复杂度。
- 给定一个存放整数的数组,重新排列数组使得数组左边为奇数,右边为偶数。要求:空间复杂度O(1),时间复杂度为O(n)
- 一个数组中,存在两个只出现一次的数字,其余的数字均出现两次。要求在时间复杂度o(n),空间复杂度为o(1)的情况下找出这两个数字
- 对于一颗完全二叉树,要求给所有节点加上一个pNext指针,指向同一层的相邻节点;如果当前节点已经是该层的最后一个节点,则将pNext指针指向NULL;给出程序实现,并分析时间复杂度和空间复杂度。