leecode第一天

1、两数之和
# 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。
# 你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。
# 你可以按任意顺序返回答案。

#自己
class Solution(object):
    def twoSum(self, nums, target):
        """
        :type nums: List[int]5
        :type target: int
        :rtype: List[int]
        """
        for i in range(len(nums)):
            for j in range(i+1,len(nums)):
                if nums[i]+nums[j]==target:
                    return [i,j]
#hash表
class Solution(object):
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        hashtable = dict()
        for i, num in enumerate(nums):
            if target - num in hashtable:
                return [hashtable[target- num], i]
            
            hashtable[num] = i

        return []
开始
初始化哈希表
遍历数组元素
补数在哈希表中?
返回两个索引
存储当前数值到哈希表
返回空列表
2、两数相加
# 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

# 请你将两个数相加,并以相同形式返回一个表示和的链表。

# 你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

class Solution(object):

    def addTwoNumbers(self, l1, l2):
        """
        将两个表示非负整数的逆序链表相加,并返回一个新的逆序链表表示它们的和。

        每个链表的节点存储一位数字,且数字按逆序方式存储。函数将两个链表表示的数字相加,
        并以相同形式返回一个新链表表示它们的和。

        参数:
        l1 (ListNode): 第一个链表的头节点。
        l2 (ListNode): 第二个链表的头节点。

        返回:
        ListNode: 新链表的头节点,表示两个输入链表所表示数字的和。
        """
        # 创建虚拟头节点,用于简化边界条件处理
        dummy = ListNode()
        curr = dummy
        carry = 0  # 初始化进位为0

        # 当l1、l2链表中还有剩余节点或存在进位时继续循环
        while l1 or l2 or carry:
            # 获取当前节点的值,如果节点为空则默认为0
            val1 = l1.val if l1 else 0
            val2 = l2.val if l2 else 0
            
            # 计算当前位的总和及新的进位值
            total = val1 + val2 + carry
            carry = total // 10#进位:总和除以10
            digit = total % 10#余数:总和取余10
            
            # 创建新节点并将其连接到结果链表
            curr.next = ListNode(digit)
            curr = curr.next
            
            # 如果当前节点存在,则移动指针到下一个节点
            if l1:
                l1 = l1.next
            if l2:
                l2 = l2.next
                
        # 返回虚拟头节点的下一个节点,即结果链表的头节点
        return dummy.next

# 正确初始化链表 l1: 2 -> 4 -> 3
l1 = ListNode(2)
l1.next = ListNode(4)
l1.next.next = ListNode(3)

# 正确初始化链表 l2: 5 -> 6 -> 4
l2 = ListNode(5)
l2.next = ListNode(6)
l2.next.next = ListNode(4)

# 创建类的实例并调用方法
solution = Solution()
result = solution.addTwoNumbers(l1, l2)

# 打印结果
while result:
    print(result.val, end=" ")
    result = result.next
Yes
No
初始化虚拟头节点
存在链表节点或进位?
计算当前位数值
计算总和与进位
创建新节点并连接
移动链表指针
返回结果链表头节点
9、回文数
class Solution(object):
    def isPalindrome(self, x):
        """
        :type x: int
        :rtype: bool
        """
        
		"""
        emp=str(x)
        temp_reverse=temp[::-1]
        if temp==temp_reverse:
            return True
        else:
            return False
        """
        return str(x) == str(x)[::-1]
Yes
No
开始
将整数转为字符串
反转字符串
原字符串等于反转字符串?
返回True
返回False
13、罗马数字转整数
def romanToInt(self, s):
    """
    将罗马数字转换为整数。
    
    罗马数字是用几个字母表示的:I(1),V(5),X(10),L(50),C(100),D(500)和M(1000)。
    例如,罗马数字 II 表示两个一,即2,而 XII 表示十加一加一,即12。
    通常,罗马数字中小的数字在大的数字左边,但也有例外,如 IV 表示4,IX 表示9。
    
    参数:
    s: 罗马数字字符串。
    
    返回值:
    转换后的整数。
    """
    # 定义罗马数字与对应整数值的字典
    roman = {'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000}
    # 初始化结果变量为0
    res = 0
    # 遍历罗马数字字符串,除了最后一个字符
    for i in range(len(s)-1):
        # 如果当前罗马数字小于后面的罗马数字,说明需要减去当前值
        if roman[s[i]] < roman[s[i+1]]:
            res -= roman[s[i]]
        else:
            # 否则,加上当前罗马数字的值
            res += roman[s[i]]
    # 加上最后一个罗马数字的值
    res += roman[s[-1]]
    # 返回转换后的整数结果
    return res
开始
初始化字典和res=0
遍历字符i从0到倒数第二位
当前值 < 下一值?
res减去当前值
res加上当前值
继续下一轮循环
加末尾字符值到res
返回结果res
14、最长公共前缀
	def longestCommonPrefix(self, strs):
        """
        找到字符串列表中最长的公共前缀。
        
        :param strs: 包含多个字符串的列表
        :type strs: List[str]
        :return: 最长的公共前缀字符串
        :rtype: str
        """
        # 初始化结果变量为空字符串
        res = ""
        # 遍历第一个字符串的每个字符
        for i in range(len(strs[0])):
            # 遍历字符串列表中的每个字符串
            for j in strs:
                # 如果当前索引超出某个字符串的长度,或者字符不匹配,则返回当前结果
                if i == len(j) or j[i] != strs[0][i]:
                    return res
            # 如果所有字符串在当前索引处的字符都匹配,则将该字符添加到结果中
            res += strs[0][i]
        # 返回最终的公共前缀
        return res
字符未遍历完
全部通过检查
遍历完成
初始化空结果
遍历首字符串每个字符
检查所有字符串当前位置
字符相同且未越界?
继续检查下一个字符串
返回当前结果
追加字符到结果
返回最终结果
### LeetCode 第一题 C语言 解决方案 对于LeetCode的第一题,通常被称为“两数之和”,其目标是从给定的整数数组`nums`中找到两个不同的索引`i`和`j`使得`nums[i] + nums[j] = target`。下面是一个有效的C语言实现方法: 此算法通过遍历整个列表并利用哈希表来存储已经访问过的数值及其对应的索引来提高效率[^1]。 ```c #include <stdio.h> #include <stdlib.h> int* twoSum(int* nums, int numsSize, int target, int* returnSize){ // 创建一个临时结构体用于保存数值以及它们的位置 typedef struct { int value; int index; } NumIndexPair; // 动态分配内存创建NumIndexPair类型的数组 NumIndexPair *pairs = (NumIndexPair *)malloc(numsSize * sizeof(NumIndexPair)); // 将输入数据复制到新创建的数据结构中 for (int i = 0; i < numsSize; ++i) { pairs[i].value = nums[i]; pairs[i].index = i; } // 对pair按照value升序排列 qsort(pairs, numsSize, sizeof(NumIndexPair), [](const void *a, const void *b)->int{return ((NumIndexPair*)a)->value - ((NumIndexPair*)b)->value;} ); // 使用双指针法寻找满足条件的一对数字 int left = 0, right = numsSize - 1; while (left < right) { int sum = pairs[left].value + pairs[right].value; if (sum == target) break; else if (sum < target) ++left; else --right; } // 如果找到了这样的组合,则返回这两个位置;如果没有则返回NULL表示失败 if (left >= right) { free(pairs); *returnSize = 0; return NULL; } else { static int indices[2]; // 静态变量可以作为函数的结果直接返回而不需要额外释放空间 indices[0] = pairs[left].index; indices[1] = pairs[right].index; *returnSize = 2; free(pairs); // 清理动态分配的空间 return indices; } } ``` 这段代码实现了快速查找两个加起来等于特定目标值的目标,并且能够处理重复元素的情况。注意这里使用了静态局部变量`indices[]`以便可以直接将其地址作为结果返回而不必担心离开作用域后的有效性问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值