【基础算法】浅浅刷个小题 # 移动零 # 丢失的数字 # 转换成小写字母 # 和为零的N个不同整数 # 猜数字 #



C/C++学习路线 (点击解锁)(●’◡’●)
❤️C语言
❤️初阶数据结构与算法
❤️C++
❤️高阶数据结构
❤️Linux系统编程与网络编程

283. 移动零

  • 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
  • 请注意 ,必须在不复制数组的情况下原地对数组进行操作。
  • 示例 1:

    输入: nums = [0,1,0,3,12]
    输出: [1,3,12,0,0]

  • 示例 2:

    输入: nums = [0]
    输出: [0]

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/move-zeroes

解题思路:

  • 首先创建两个变量 (left = 0;right = 0) (也可以用指针)分别初始化零(相当于数组第一个元素的下标),用 nums[right] 去遍历数组,当nums[right] 为零时, right++ 为下一个元素的下标,left不变,也就是说,left用来跟随为零的元素,right则跟随不是零的元素,当nums[right] 不是零时,将nums[right] 的值与nums[left] 的值交换,随后left++ 。(当不是零时,left与right都加加为下一个元素的下标,这里交换实际上没变化)。

下面是C语言代码实现:

void moveZeroes(int* nums, int numsSize) {
	int left = 0;
	int right = 0;
	while (right < numsSize)
	{
		if (nums[right])
		{
			int tmp = nums[right];
			nums[right] = nums[left];
			nums[left] = tmp;
			left++;
		}
		right++;
	}
}

268. 丢失的数字

给定一个包含 [0, n] 中 n 个数的数组 nums ,找出 [0, n] 这个范围内没有出现在数组中的那个数。

  • 示例 1:

    输入:nums = [3,0,1]
    输出:2
    解释:n = 3,因为有 3 个数字,所以所有的数字都在范围 [0,3] 内。2 是丢失的数字,因为它没有出现在 nums 中。

  • 示例 2:

    输入:nums = [0,1]
    输出:2
    解释:n = 2,因为有 2 个数字,所以所有的数字都在范围 [0,2] 内。2 是丢失的数字,因为它没有出现在 nums 中。

  • 示例 3:

    输入:nums = [9,6,4,2,3,5,7,0,1]
    输出:8
    解释:n = 9,因为有 9 个数字,所以所有的数字都在范围 [0,9] 内。8 是丢失的数字,因为它没有出现在 nums 中。

  • 示例 4:

    输入:nums = [0]
    输出:1
    解释:n = 1,因为有 1 个数字,所以所有的数字都在范围 [0,1] 内。1 是丢失的数字,因为它没有出现在 nums 中。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/missing-number

解题思路:

  • 由题目意思我们可以这样操作:
    只要将范围以内的所有值的和减去数组所有元素的和便可以得到那个消失的数字。

下面是C语言代码实现:

int missingNumber(int* nums, int numsSize){
    int sum1 = 0;
    int sum2 = 0;
    for (int i = 0; i < numsSize; i++)
    {
        sum1 += nums[i];
    }
    for (int j = 0; j <= numsSize; j++)
    {
        sum2 += j;
    }
    return sum2 - sum1;
}

709. 转换成小写字母

给你一个字符串 s ,将该字符串中的大写字母转换成相同的小写字母,返回新的字符串。

  • 示例 1:

    输入:s = “Hello”
    输出:“hello”

  • 示例 2:

    输入:s = “here”
    输出:“here”

  • 示例 3:

    输入:s = “LOVELY”
    输出:“lovely”

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/to-lower-case

解题思路:

首先介绍两个函数:

  • isupper :判断一个字母是否为大写字母,如果是返回一个大于零的数
  • tolower :将大写字母转为小写字母
  • 有了这两个函数,我们可以用 isupper 判断每一个字母是否为大写字母,如果是就用 tolower 将该字母转化为小写并放入对应数组元素中,这样便可以很好的转换。

下面是C语言代码实现:

char * toLowerCase(char * s){
    int len = strlen(s);
    for (int i = 0; i < len; i++)
    {
        if (isupper(s[i]) > 0)
        {
            s[i] = tolower(s[i]);
        }
    }
    return s;
}

1304. 和为零的 N 个不同整数

给你一个整数 n,请你返回 任意 一个由 n 个 各不相同 的整数组成的数组,并且这 n 个数相加和为 0 。

  • 示例 1:

    输入:n = 5
    输出:[-7,-1,1,3,4]
    解释:这些数组也是正确的 [-5,-1,1,2,3],[-3,-1,2,-2,4]。

  • 示例 2:

    输入:n = 3
    输出:[-1,0,1]

  • 示例 3:

    输入:n = 1
    输出:[0]

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/find-n-unique-integers-sum-up-to-zero

解题思路:

  • 由题目意思,我们只需要返回一个符合题目要求的数组即可;
  • 所以我们可以这样:将数组最后一个元素设为其前面所有元素的和的负数,这样既符合题目要求,并且操作起来简易。

以下是C语言代码实现:

int* sumZero(int n, int* returnSize){
    *returnSize = n;
    int* ret = (int*) malloc(n*sizeof(int));
    int sum = 0;
    for (int i=1; i<n; i++) {
        sum +=i;
        ret[i-1] = i;
    } 
    ret[n-1] = -sum;
    return ret;
}

LCP 01. 猜数字

这一题可以说是我在力扣上找回自信的一题,这里不做讲解,直接看题目与代码很容易理解。

题目:

  • 小A 和 小B 在玩猜数字。小B 每次从 1, 2, 3 中随机选择一个,小A 每次也从 1, 2, 3 中选择一个猜。他们一共进行三次这个游戏,请返回 小A 猜对了几次?
  • 输入的guess数组为 小A 每次的猜测,answer数组为 小B 每次的选择。guess和answer的长度都等于3。
  • 示例 1:

    输入:guess = [1,2,3], answer = [1,2,3]
    输出:3
    解释:小A 每次都猜对了。

  • 示例 2:

    输入:guess = [2,2,3], answer = [3,2,1]
    输出:1
    解释:小A 只猜对了第二次。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/guess-numbers

以下是C语言代码实现:

int game(int* guess, int guessSize, int* answer, int answerSize){
    int count = 0;
    for (int i = 0 ; i < guessSize; i++)
    {
        if (guess[i] == answer[i])
        {
            count++;
        }
    }
    return count;
}

At the end

一件事只要你坚持得足够久, “坚持”就会慢慢变成“习惯”。 原本需要费力去驱动的事情就成了家常便饭, 原本下定决心才能开始的事情也变得理所当然。

在Go语言中,可以使用`time.Ticker`和`sync.Map`(从Go 1.14开始引入的一个并发安全的数据结构)来创建一个存储用户名和验证码的映射,并自动过期。首先,需要导入必要的包: ```go package main import ( "time" "sync" ) ``` 然后定义一个结构体来保存用户信息,包括过期时间: ```go type User struct { Name string Captcha string ExpiresAt time.Time // 过期时间 mu sync.RWMutex } ``` 接着,你可以创建一个`UserMap`结构,它包含一个`sync.Map`以及一个定时器: ```go var userMap = make(map[string]*User) var ticker *time.Ticker func init() { ticker = time.NewTicker(5 * time.Minute) // 设置过期时间为5分钟 go tickExpire() } func tickExpire() { for _ = range ticker.C { var expiredUsers []string userMap.Range(func(key, value interface{}) bool { user := value.(*User) if user.ExpiresAt.Before(time.Now()) { expiredUsers = append(expiredUsers, key.(string)) } return true }) for _, username := range expiredUsers { delete(userMap, username) } } } ``` 现在,你可以向`userMap`添加新的用户信息并设置过期时间: ```go func addUser(name string, captcha string) { user := &User{ Name: name, Captcha: captcha, ExpiresAt: time.Now().Add(5 * time.Minute), } userMap[name] = user } ``` 当你想要获取或更新信息时,需要确保在读写操作期间锁住map: ```go func getUser(name string) (string, error) { "userMap".mu.Lock() defer "userMap".mu.Unlock() user, ok := userMap[name] if !ok { return "", fmt.Errorf("user %s not found", name) } // 返回或更新用户的验证码 return user.Captcha, nil } ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

简 料

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值