学习重点
集合一般被定义为:由一个或多个确定的元素所构成的整体。
列表(又称线性列表)的定义为:是一种数据项构成的有限序列,即按照一定的线性顺序,排列而成的数据项的集合。
数组(Array)是有序的元素序列。
二维数组是一种结构较为特殊的数组,只是将数组中的每个元素变成了一维数组。它主要用于处理矩阵的相关问题。
字符串是由零个或多个字符组成的有限序列。
双指针技巧:一个指针从头部开始,而另一个指针从尾部开始。
解题思路
搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
你可以假设数组中无重复元素。
int searchInsert(int* nums, int numsSize, int target)
{
int i;
for(i=0;i<numsSize;i++)
{
if(target <= nums[i])
return i;
}
}
零矩阵
编写一种算法,若M × N矩阵中某个元素为0,则将其所在的行与列清零
void setZeroes(int** matrix, int matrixSize, int* matrixColSize){
int i, j;
int *row = (int*)malloc(sizeof(int) * matrixSize);
int *col = (int*)malloc(sizeof(int) * matrixColSize[0]);
memset(row, 0, sizeof(int) * matrixSize);
memset(col, 0, sizeof(int) * matrixColSize[0]);
for (i = 0; i < matrixSize; i++) {
for (j = 0; j < matrixColSize[0]; j++) {
if (matrix[i][j] == 0) {
row[i] = 1;
col[j] = 1;
}
}
}
for (i = 0; i < matrixSize; i++) {
for (j = 0; j < matrixColSize[0]; j++) {
if (row[i] == 1 || col[j] == 1) {
matrix[i][j] = 0;
}
}
}
free(row);
free(col);
}
最长公共前缀
编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 “”。
char * longestCommonPrefix(char ** strs, int strsSize){
int len,i,j,k=0,jdg=0; //用来判断是否退出循环
char *s ;
s = (char *)malloc(sizeof(char) * 201);
if (strsSize == 0) {
s[0] = '\0';
return s;
}
len = strlen(strs[0]);
for (i = 1; i < strsSize; i++)
if (strlen(strs[i]) < len)
len = strlen(strs[i]);
for (i = 0; i < len; i++) {
for (j = 1; j < strsSize; j++) {
if (strs[j][i] != strs[0][i]) {
jdg = 1;
break;
}
}
if (jdg == 0)
s[k++] = strs[0][i];
else
break;
}
s[k] = '\0';
return s;
}
反转字符串
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
void reverseString(char *s, int sSize)
{
int i, j;
char temp;
for(i=0,j=sSize-1;i<j;i++,j--)
{
temp = s[i];
s[i] = s[j];
s[j] = temp;
}
}
代码地址
链接: 数据结构基础训练 数组与字符串.