一、1033. 移动石子直到连续
思路
这道题是一道数学题,它一共分为三种可能
第一种可能为三个石子本来就是连续的时候
第二种可能为最少步数为1的时候,相邻石子不能大于一格
第三种可能为最少步数为2的时候,这时相邻石子大于一格
那么第二种和第三种的最多步数都是 最远的石子 - 最近的石子 - 2
因为输入的数据是乱序的,所以还要先将他们排序了来
代码实现
int dis[3];
void sort()
{
int i , j , s , t;
for(i = 0 ;i < 3 ; i++)
{
s = i;
for(j = i + 1 ; j < 3 ; j++)
if(dis[s] > dis[j])s = j;
if(s != i)
{
t = dis[i];
dis[i] = dis[s];
dis[s] = t;
}
}
}
int* numMovesStones(int a, int b, int c, int* returnSize){
int *x=(int*)malloc(sizeof(int)*2);
dis[0] = a;
dis[1] = b;
dis[2] = c;
sort();
a = dis[0];
b = dis[1];
c = dis[2];
if(b - a == 1 && c - b == 1)
{
x[0] = 0;
x[1] = 0;
}
else if(b - a <= 2)
{
x[0] = 1;
x[1] = c - a - 2;
}
else if(c - b <= 2)
{
x[0] = 1;
x[1] = c - a - 2;
}
else
{
x[0] = 2;
x[1] = c - a - 2;
}
*returnSize = 2;
return x;
}
二、1376. 通知所有员工所需的时间
思路
这个题可以联想到树的结构,我们可以从最底层的员工开始向不断的找他的上级,再找的过程中,把通知的时间都加上,然后与max(最长的时间)相比,将较大的时间赋给max,然后再去找下一个底层员工,那么最后的max就是要通知所有员工的话要用的时间
做这个题的时候,力扣的这个自动判断数组越界就很烦,但实际上,我这个也确实没越界,所以这时候就要设一个新的数组来代替infomTime
代码实现
int numOfMinutes(int n, int headID, int* manager, int managerSize, int* informTime, int informTimeSize)
{
int ans[100001];
for(int i=0;i<n;i++){
ans[i]=informTime[i];
}
int i,max=0,a,t;
for(i=0;i<n;i++)
{
if(ans[i]==0)
{
a=manager[i];
if(a==-1)t=ans[headID];
else
{
t=ans[a];
while(a!=-1)
{
a=manager[a];
if (a == -1)continue;
t+=ans[a];
}
}
if(max<t)max=t;
}
}
return max;
}
三、有效的括号
思路
关于栈的最基础的问题,只要实现了入栈和出栈就行了,当我们遇见左括号的的时候就将它入栈,当我们遇见右括号的时候且符合右括号的时候,就将它出栈
要注意一点的是,当把字符串中的括号全都遍历完时,如果栈里面还有括号,那么也是不正确的
再次吐槽一点,力扣的这个编译器跟真的好伤人心
代码实现
typedef struct
{
char date[10001];
int top;
}zlink;
void enzlink(zlink *p,char x)
{
p->top++;
p->date[p->top] = x;
}
void dezlink(zlink *p)
{
p->top--;
}
bool isValid(char* s) {
zlink p;
p.top = 0;
p.date[0] = '0';
for (int i = 0; i < strlen(s); i++)
{
if (s[i] == '(' || s[i] == '{' || s[i] == '[')enzlink(&p, s[i]);
else
{
if (p.date[p.top] == '(' && s[i] == ')')dezlink(&p);
else if (p.date[p.top] == '{' && s[i] == '}')dezlink(&p);
else if (p.date[p.top] == '[' && s[i] == ']')dezlink(&p);
else return false;
}
}
if (p.top != 0)return false;
return true;
}
四、387. 字符串中的第一个唯一字符
思路
首先这个题,可以用哈希
我们可以设置一个记录次数的数组,当一个字母出现过,那么次数至少为1,用字母的位置在新数组中显示,后面遍历数组的时候,遇到第一个次数为1 的,直接返回它的位置;
代码实现
int firstUniqChar(char * s){
int num[30]={0};
for(int i=0;i<strlen(s);i++){
num[s[i]-'a']++;
}
for(int i=0;i<strlen(s);i++){
if(num[s[i]-'a']==1)return i;
}
return -1;
}