算法日志——第二天

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 算法日志——第二天

@TOC


一、错误的集合

1.题目描述

集合 s 包含从 1 到 n 的整数。不幸的是,因为数据错误,导致集合里面某一个数字复制了成了集合里面的另外一个数字的值,导致集合 丢失了一个数字 并且 有一个数字重复 。
给定一个数组 nums 代表了集合 S 发生错误后的结果。
请你找出重复出现的整数,再找到丢失的整数,将它们以数组的形式返回。
集合 s 包含从 1 到 n 的整数。不幸的是,因为数据错误,导致集合里面某一个数字复制了成了集合里面的另外一个数字的值,导致集合 丢失了一个数字 并且 有一个数字重复 。

题目地址:645.错误的集合
在这里插入图片描述
在这里插入图片描述

2.解题思路

==排序==
先使用qsort对数组进行排序,比较相邻元素,即可找到错误的集合
寻找重复的数字比较简单,如果相邻两元素相等,则该元素为重复元素。
寻找丢失数字相对复杂,有以下两种判断:
1.如果丢失的数字大于1且小于numsSize,则一定存在相邻的两元素大于1,这两个元素之间的数字即为丢失的数字。
2.如果丢失的为1或n,需另外判断。

3.代码实现

int cmp_int(const void* e1, const void* e2)
{
    return *(int*)e1 - *(int*)e2;
}
int* findErrorNums(int* nums, int numsSize, int* returnSize)
{
    qsort(nums, numsSize, sizeof(int), cmp_int);
    *returnSize = 2;
    int prev = 0;
    int i = 0;
    for (i = 0; i < numsSize; i++)
    {
        int curr = nums[i];
        if (curr == prev)
        {
            nums[0] = prev;
        }
        else if (curr - prev > 1)
        {
            nums[1] = prev + 1;
        }
        prev = curr;
    }
    if (nums[numsSize - 1] != numsSize)
        nums[1] = numsSize;
    return nums;
}

二、密码检查

1.题目描述

小明同学最近开发了一个网站,在用户注册账户的时候,需要设置账户的密码,为了加强账户的安全性,小明对密码强度有一定要求:
1. 密码只能由大写字母,小写字母,数字构成;

  1. 密码不能以数字开头;
  2. 密码中至少出现大写字母,小写字母和数字这三种字符类型中的两种;
  3. 密码长度至少为8

现在小明受到了n个密码,他想请你写程序判断这些密码中哪些是合适的,哪些是不合法的。
输入描述:
输入一个数n,接下来有n(n≤100)行,每行一个字符串,表示一个密码,输入保证字符串中只出现大写字母,小写字母和数字,字符串长度不超过100。
输出描述:
输入n行,如果密码合法,输出YES,不合法输出NO

题目地址:OR141密码检查
在这里插入图片描述

2.解题思路

考察点为一些字符分类函数的使用

在这里插入图片描述

3.代码实现

#include<stdio.h>
#include<string.h>
#include<ctype.h>
int main()
{
    int n = 0;
    scanf("%d", &n);
    char arr[100];
    int i = 0;
    for (i = 0; i < n; i++)
    {
        int flag = 1;
        scanf("%s", arr);
        int sz = strlen(arr);
        if (isdigit(arr[0]))
        {
            flag=0;
        }
        if (sz < 8)
        {
            flag = 0;
        }
        int j = 0;
        int a = 0, b = 0, c = 0;
        for (j = 0; j < sz; j++)
        {
            if (!isalnum(arr[j]))
            {
                break;
            }
            if (isdigit(arr[j]))
            {
                a=1;
            }
            if (islower(arr[j]))
            {
                b=1;
            }
            if (isupper(arr[j]))
            {
                c=1;
            }
        }
        if (j != sz && a + b + c < 2)
        {
            flag = 0;
        }
        if (flag == 1)
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}

三、旋转数组最小数字

1.题目描述

有一个长度为 n 的非降序数组,比如[1,2,3,4,5],将它进行旋转,即把一个数组最开始的若干个元素搬到数组的末尾,变成一个旋转数组,比如变成了[3,4,5,1,2],或者[4,5,1,2,3]这样的。请问,给定这样一个旋转数组,求数组中的最小值。
数据范围:1≤n≤10000,数组中任意元素的值: 0≤val≤10000
要求:空间复杂度:O(1) ,时间复杂度:O(logn)

题目描述:JZ11旋转数组最小数字
在这里插入图片描述
在这里插入图片描述

2.解题思路

==二分查找==
排序数组的查找问题首先考虑二分法解决,其可将遍历的线性级别时间复杂度降至对数级别
1.数组可以分为两个有序的子数组。其中,左排序的数组的值大于右排序数组中的值。
如图:

在这里插入图片描述

2.声明left,right 分别指向数组的左右两端;

  1. mid = (left+right) / 2 为二分的中间位置。

4.midleft,right分为三种情况:
a. rotateArray[mid] > rotateArray[right]时, 那么 最小值一定在 [mid+1,right]区间中;
b.rotateArray[mid] < rotateArray[right]时,那么最小值一定在[left,mid]区间内。
c. rotateArray[mid] = rotateArray[right]时,无法判断最小值在哪个区间,所以此时只能缩小right的值。
如图:

在这里插入图片描述

3.代码实现

int minNumberInRotateArray(int* rotateArray, int rotateArrayLen ) {
    if(rotateArrayLen==0)
    {
        return 0;
    }
    int left=0;
    int right=rotateArrayLen-1;
    while(left<=right)
    {
          if(rotateArray[left]<rotateArray[right])//left即为最小值
          {
              return rotateArray[left];
          }
        int mid=left+(right-left)/2;
        if(rotateArray[mid]>rotateArray[right])//最小值在右侧
        {
            left=mid+1;
        }else  if(rotateArray[mid]<rotateArray[right])//最小值在左侧
        {
            right=mid;
        }else//相等,需要调整
        {
            right--;
        }
    }
        return rotateArray[left];
}
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
15天前
|
算法 关系型数据库 程序员
第一周算法设计与分析:A : log2(N)
这篇文章介绍了解决算法问题"输入一个数N,输出log2N(向下取整)"的三种编程思路,包括使用对数函数和幂函数的转换方法,以及避免浮点数精度问题的整数逼近方法。
|
2月前
|
存储 算法 缓存
高并发架构设计三大利器:缓存、限流和降级问题之使用RateLimiter来限制操作的频率问题如何解决
高并发架构设计三大利器:缓存、限流和降级问题之使用RateLimiter来限制操作的频率问题如何解决
|
2月前
|
存储 算法 Java
高并发架构设计三大利器:缓存、限流和降级问题之滑动日志算法问题如何解决
高并发架构设计三大利器:缓存、限流和降级问题之滑动日志算法问题如何解决
|
算法 安全 Java
JVM学习日志(十) 垃圾回收算法
垃圾回收算法 简述
61 0
JVM学习日志(十) 垃圾回收算法
|
4月前
|
算法 测试技术 C++
【数据结构】模式匹配之KMP算法与Bug日志—C/C++实现
【数据结构】模式匹配之KMP算法与Bug日志—C/C++实现
54 0
|
算法 安全 机器人
Baumer工业相机堡盟工业相机如何联合BGAPISDK和Halcon实现图像的对数Log变换算法增强(C#)
Baumer工业相机堡盟工业相机如何联合BGAPISDK和Halcon实现图像的对数Log变换算法增强(C#)
106 0
Baumer工业相机堡盟工业相机如何联合BGAPISDK和Halcon实现图像的对数Log变换算法增强(C#)
|
运维 监控 算法
事件日志分析算法:提升上网行为管理软件的智能监控
随着互联网的快速发展,网络安全和上网行为管理变得越来越重要了。不少企业和组织为了维护网络的安全、稳定性,还有员工的工作效率,都开始使用上网行为管理软件。这些软件的作用就是监控、分析和控制员工的上网行为,帮助组织管理网络资源,以免潜在的网络威胁和数据泄漏。其中,事件日志分析算法发挥了关键作用,它们有各种各样的优点和用途,真的非常实用。接下来,就让我们来看看,事件日志分析算法在这方面有哪些厉害的地方以及怎么用吧!
186 0
|
算法 安全 机器人
Baumer工业相机堡盟工业相机如何联合BGAPISDK和OpenCVSharp实现图像的对数Log变换算法增强(C#)
Baumer工业相机堡盟工业相机如何联合BGAPISDK和OpenCVSharp实现图像的对数Log变换算法增强(C#)
75 0
|
6天前
|
算法 BI Serverless
基于鱼群算法的散热片形状优化matlab仿真
本研究利用浴盆曲线模拟空隙外形,并通过鱼群算法(FSA)优化浴盆曲线参数,以获得最佳孔隙度值及对应的R值。FSA通过模拟鱼群的聚群、避障和觅食行为,实现高效全局搜索。具体步骤包括初始化鱼群、计算适应度值、更新位置及判断终止条件。最终确定散热片的最佳形状参数。仿真结果显示该方法能显著提高优化效率。相关代码使用MATLAB 2022a实现。
|
6天前
|
算法 数据可视化
基于SSA奇异谱分析算法的时间序列趋势线提取matlab仿真
奇异谱分析(SSA)是一种基于奇异值分解(SVD)和轨迹矩阵的非线性、非参数时间序列分析方法,适用于提取趋势、周期性和噪声成分。本项目使用MATLAB 2022a版本实现从强干扰序列中提取趋势线,并通过可视化展示了原时间序列与提取的趋势分量。代码实现了滑动窗口下的奇异值分解和分组重构,适用于非线性和非平稳时间序列分析。此方法在气候变化、金融市场和生物医学信号处理等领域有广泛应用。