刷题记录˃ʍ˂

一、1033. 移动石子直到连续b7e056b42ca24bfca73a1b2141a25ea0.png

 62860ae100a64ae6828c8e3eaa835154.png

 思路

这道题是一道数学题,它一共分为三种可能

第一种可能为三个石子本来就是连续的时候

第二种可能为最少步数为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. 通知所有员工所需的时间

 0066dd1149544623996a4cb9366d7ad2.png

cc1c8d06e9984643b217f06b9efcc1c5.png

思路

这个题可以联想到树的结构,我们可以从最底层的员工开始向不断的找他的上级,再找的过程中,把通知的时间都加上,然后与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;
}

三、有效的括号

fd33c316d23f4381a49e155208f66d10.png 

64ce824a2e8c408dafcd8323b72f8f61.png 

 思路

关于栈的最基础的问题,只要实现了入栈和出栈就行了,当我们遇见左括号的的时候就将它入栈,当我们遇见右括号的时候且符合右括号的时候,就将它出栈

要注意一点的是,当把字符串中的括号全都遍历完时,如果栈里面还有括号,那么也是不正确的

再次吐槽一点,力扣的这个编译器跟真的好伤人心

代码实现

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. 字符串中的第一个唯一字符

779607df65a048e7adec3ec4c06c6797.png

 思路

首先这个题,可以用哈希

我们可以设置一个记录次数的数组,当一个字母出现过,那么次数至少为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;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值