力扣刷题day1(两数相加,回文数,罗马数转整数)

题目1:1.两数之和

思路1和解析:

//1.暴力枚举解法(历遍两次数组,时间复杂度O(N^2),空间复杂度O(1)
int* twoSum(int* nums, int numsSize, int target, int* returnSize) 
{
    for (int i = 0; i < numsSize; ++i) //从数组第一个位置开始
    {
        for (int j = i + 1; j < numsSize; ++j)//从固定位置的下一个位置开始找
        {
            if (nums[i] + nums[j] == target) //找到的时候
            {
                int* ret = malloc(sizeof(int) * 2);//在内存中分配足够的空间用来存储两个整数的大小,并将指向这块空间的指针赋值给了ret。
                //换句话说,这行代码使用了C语言中的malloc函数来动态分配了两个整数大小的内存空间,并将指向这块内存空间的指针保存在了ret变量中。
                ret[0] = i, ret[1] = j;//将变量i的值存储在ret指向的内存空间的第一个位置,j存在第二个位置
                *returnSize = 2;//将包含数组大小的值设置为2
                return ret;//返回指向数组的指针ret
            }
        }
    }
    *returnSize = 0;
    return NULL;//不存在,返回空指针
}

 思路2和解析:

// 向哈希表中插入新条目或更新现有条目
void insert(int ikey, int ival)
{
    struct hashTable* it = find(ikey); // 查找具有指定键的条目
    if (it == NULL) // 如果条目不存在
    {
        struct hashTable* tmp = malloc(sizeof(struct hashTable)); // 分配内存以创建新条目
        tmp->key = ikey, tmp->val = ival; // 设置新条目的键和值
        HASH_ADD_INT(hashtable, key, tmp); // 将新条目添加到哈希表中
    }
    else // 如果条目已经存在
    {
        it->val = ival; // 更新现有条目的值
    }
}

// 在数组中查找两个数字,使它们的和等于目标值
int* twoSum(int* nums, int numsSize, int target, int* returnSize)
{
    hashtable = NULL; // 初始化哈希表
    for (int i = 0; i < numsSize; i++) // 遍历输入数组
    {
        struct hashTable* it = find(target - nums[i]); // 查找当前数字的补数在哈希表中是否存在
        if (it != NULL) // 如果在哈希表中找到了补数
        {
            int* ret = malloc(sizeof(int) * 2); // 分配内存以创建结果数组
            ret[0] = it->val, ret[1] = i; // 设置结果数组为找到的两个数字的索引
            *returnSize = 2; // 设置返回数组的大小为2
            return ret; // 返回结果数组
        }
        insert(nums[i], i); // 将当前数字及其索引插入哈希表
    }
    *returnSize = 0; // 如果没有找到解,则将返回数组的大小设置为0
    return NULL; // 返回NULL
}

题目2:9.回文数

思路1和解析:

//回文数
//1.
bool isPalindrome(int x)
{
    if (x < 0)
        return false;//因为负数不可能是一个回文数
    long int a, b = 0;//创建变量,注意变量范围
    a = x;//存储a值
    //逆序求值,如果相当说明是回文数
    while (a != 0)
    {
        b = b * 10 + a % 10;
        a = a / 10;
    }
    if (x == b)
        return true;
    else
        return false;
}

思路2和解析:

//2.
bool isPalindrome(int x)
{
    char s[20];
    int i;
    sprintf(s, "%d", x);//将字符类型转换为整型
    int l = strlen(s);//计算长度
    for (i = 0; i < l / 2; i++)
    {
        if (s[i] != s[l - i - 1])//看对应位上的数字是否相当,如果是奇数位,中间位不用管
        {
            return false;//发现不相当就不是回文数,反之就是
        }
    }
    return true;
}

题目3:13.罗马数字转整数

思路和解析: 

//罗马数字转整数
int getHash(char c) //传入字符
{
    switch (c) //根据传入字符选择对应的值
    {
    case 'I':
        return 1;
    case 'V':
        return 5;
    case 'X':
        return 10;
    case 'L':
        return 50;
    case 'C':
        return 100;
    case 'D':
        return 500;
    case 'M':
        return 1000;
    default:
        return 0;
    }
}

int romanToInt(char* s) 
{
    int ret = 0;//创建个变量用来存储值
    for (int i = 0; s[i]; i++) 
    {
        if (getHash(s[i]) < getHash(s[i + 1]))
        {
            ret += (-getHash(s[i]));//小于的时候,比如IV,I<V,IV是4,就是V-I
        }
        else//反之就是大于,不存在特殊情况,直接加上去就行
        {
            ret += getHash(s[i]);
        }
       /* ret += getHash(s[i]) < getHash(s[i + 1]) ? -getHash(s[i]) : getHash(s[i]);*/
    }
    return ret;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小蓝lanll

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

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

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

打赏作者

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

抵扣说明:

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

余额充值