题目1:14.最长公共前缀
思路和解析:
#define _CRT_SECURE_NO_WARNINGS
//最长公共前缀
char* longestCommonPrefix(char** strs, int strsSize)
{
// 如果字符串数组为空,则返回空字符串
if (strsSize == 0)
{
return "";
}
// 将第一个字符串设定为最长公共前缀值
char* prefix = strs[0];
// 逐一比较每个字符串,更新最长公共前缀值
for (int i = 1; i < strsSize; i++)
{
int j = 0;
// 逐个字符比较,直到遇到字符串末尾或者不相等的字符
//以["flower","flow","flight"]举例
//j=0进去,历遍完flower
//j=1进去,到判断为\0停止,截断位置为w
//j=2进去,到o!=i停止,截断位置为l
while (prefix[j] != '\0' && strs[i][j] != '\0' && prefix[j] == strs[i][j])
{
j++;
}
// 将最长公共前缀值截断至当前位置
prefix[j] = '\0';
}
return prefix;
}
题目2:20.有效的括号
思路和解析:
//有效的括号
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include<stdbool.h>
bool isValid(char* s)
{
int len = strlen(s); // 获取字符串长度
int* stack = malloc(sizeof(int) * len); // 创建一个数组作为栈
int count = 0; // 记录栈中元素个数
for (int i = 0; i < len; i++)
{
if (s[i] == '(') // 如果是左括号'(',则将对应的右括号')'入栈
{
stack[count++] = ')';
}
else if (s[i] == '{') // 如果是左花括号'{',则将对应的右花括号'}'入栈
{
stack[count++] = '}';
}
else if (s[i] == '[') // 如果是左方括号'[',则将对应的右方括号']'入栈
{
stack[count++] = ']';
}
else if (count == 0 || stack[count - 1] != s[i]) // 如果栈为空或栈顶元素不等于当前字符,则返回false
{
return false;
}
else // 否则出栈一个元素
{
count--;
}
}
return count == 0; // 最后检查栈是否为空,若为空则返回true,否则返回false
}
题目3:26.删除有序数组中的重复项
思路和解析:
//删除有序数组中的重复项
//
int removeDuplicates(int* nums, int numsSize)
{
int fast = 0, slow = 0;//fast为找不同元素的指针,slow算是存储不同元素的指针
while (fast < numsSize)
{
if (nums[fast] == nums[slow])
{
fast++;//相等的时候,快指针开始找下一个值
}
else
//不相等的时候,慢指针开始存储值
{
slow++;
nums[slow] = nums[fast++];
}
}
return slow + 1;//返回慢指针
// 最后返回的是slow+1,因为slow为下标,+1后才是数组长度
}