一、数组
(题目与程序摘自《剑指offer》)
数组可以说是最简单的一种数据结构,它占用一块连续的内存并按照顺序存放。创建数组时我们需要知道数组的容量大小,然后根据大小分配内存。
由于不管有多少元素,数组都会为全部数据预算内存,所以空间效率不高;但是,由于数组中的内存是连续的,可以根据下标在O(1)时间读写任何元素,时间效率极高。
数组和指针是相互联系又相互关联,又有区别的两个概念。需要注意的是,使用指针访问数据库中的元素的时候,需要确保没有超出数组的边界。
例题:二维数组中的查找
void TestDemo() { int matrix[][4] = {{1, 2, 8, 9}, {2, 4, 9, 12}, {4, 7, 10, 13}, {6, 8, 11, 15}}; Test((int*)matrix, 4, 4, 7, true); } void Test(char* testName, int* matrix, int rows, int columns, int number, bool expected) { Find(matrix, rows, columns, number); } bool Find(int* matrix, int rows, int columns, int number) { bool found = false; if(matrix != NULL && rows > 0 && columns > 0) { int row = 0; int column = columns - 1; while(row < rows && column >=0) { if(matrix[row * columns + column] == number) { found = true; break; } else if(matrix[row * columns + column] > number) -- column; else ++ row; } } return found; }
二、字符串
(题目与程序摘自《剑指offer》)
C/C++中每个字符串都以‘\0‘结尾,因此可以根据这个特点找见字符串的结尾,同样也会有额外的开销,所以需要注意字符串的越界问题。
为了节省内存,C/C++把常量字符串放在单独的一个内存区域。
char str1[]="hello world"; char str2[]="hello world"; char* str3="hello world"; char* str4="hello world";
str1和str2是两个字符串数组,并且是两个初始地址不同的数组,因此str1和str2的值也不相同。
str3和str4是两个指针,无须为它们分配内存以存放数据。str3和str4指向的是同一个地址。所以比较str3和str4的值得到的结果是相同的。
String str="hello"; str.ToUpper(); str.Insert(0," world");
以上虽然对str进行了操作,但是操作的结果都是在生成一个新的String实例并返回值中返回,str中的值本身不会发生变化。用String作连续修改,每一次修改都会产生一个临时对象,开销太大。因此在C#和Java中有StringBuilder,来容纳修改后的结果。
例题:替换空格
void ReplaceBlank(char string[], int length) { if(string == NULL && length <= 0) return; /*originalLength 为字符串string的实际长度*/ int originalLength = 0; int numberOfBlank = 0; int i = 0; while(string[i] != ‘\0‘) { ++ originalLength; if(string[i] == ‘ ‘) ++ numberOfBlank; ++ i; } /*newLength 为把空格替换成‘%20‘之后的长度*/ int newLength = originalLength + numberOfBlank * 2; if(newLength > length) return; int indexOfOriginal = originalLength; int indexOfNew = newLength; while(indexOfOriginal >= 0 && indexOfNew > indexOfOriginal) { if(string[indexOfOriginal] == ‘ ‘) { string[indexOfNew --] = ‘0‘; string[indexOfNew --] = ‘2‘; string[indexOfNew --] = ‘%‘; } else { string[indexOfNew --] = string[indexOfOriginal]; } -- indexOfOriginal; } }
如果是合并两个数组时,从前往后复制需要移动多次,从后往前复制,这样就能减少移动的次数,从而提高效率。
时间: 2024-08-25 07:35:15