刷题系列博客链接:机试题目

目录

题目及示例

我的题解

C语言实现哈希表


题目及示例

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。

示例:给定 nums = [2, 7, 11, 15], target = 9,因为 nums[0] + nums[1] = 2 + 7 = 9,所以返回 [0, 1]。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/two-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

我的题解

//这题是我做的力扣第一题,还没用Java做题。
//因为力扣的题目形式的反人类性和这题给的参数的超级反人类性,这题折腾好久,提交了14遍,我吐了...
//我的C语言代码,极其慢。
int* twoSum(int* nums, int numsSize, int target, int* returnSize){ int *a = (int *)malloc(sizeof(int) * 2);int i, j;for (i = 0; i < numsSize - 1; i++) {for (j = i + 1; j < numsSize; j++) {if (nums[i] + nums[j] == target) {a[0] = i;a[1] = j;*returnSize = 2;return a;}}}               *returnSize = 0;return a;
}
//做完这题我就改用Java做题了,真香...
import java.util.HashMap;
import java.util.Map;class Solution {public int[] twoSum(int[] nums, int target) {int[] indexs = new int[2];// 建立k-v ,一一对应的哈希表HashMap<Integer,Integer> hash = new HashMap<Integer,Integer>();for(int i = 0; i < nums.length; i++){if(hash.containsKey(nums[i])){indexs[0] = i;indexs[1] = hash.get(nums[i]);return indexs;}// 将数据存入 key为补数 ,value为下标hash.put(target-nums[i],i);}// // 双重循环 循环极限为(n^2-n)/2 // for(int i = 0; i < nums.length; i++){//     for(int j = nums.length - 1; j > i; j --){//         if(nums[i]+nums[j] == target){//            indexs[0] = i;//            indexs[1] = j; //            return indexs;//         }//     }// }return indexs;}
}

C语言实现哈希表:

//大佬的C语言代码,手写哈希表方法
typedef struct Node {int index;int data;
} NODE;typedef struct HashTable {NODE *element;int size;
} HASH_TABLE;HASH_TABLE* HashTableInit(int size)
{HASH_TABLE* table;if (size <= 0) {return NULL;}table = (HASH_TABLE *)malloc(sizeof(HASH_TABLE));if (table == NULL) {return NULL;}table->size = size;table->element = (NODE *)malloc(sizeof(NODE) * size);if (table->element == NULL) {return NULL;}memset(table->element, 0xff, sizeof(NODE) * size);return table;
}int HashAddrGet(int data, int size)
{int addr = data % size;return (addr >= 0) ? addr : addr + size;
}void HashInsert(HASH_TABLE *table, int index, int data)
{int addr = HashAddrGet(data, table->size);while (table->element[addr].index != -1) {addr = (addr + 1) % table->size;}table->element[addr].index = index;table->element[addr].data = data;return;
}NODE* HashFind(HASH_TABLE *table, int data)
{int tmp = HashAddrGet(data, table->size);int addr = tmp;do {if (table->element[addr].index == -1) {return NULL;}if (table->element[addr].data == data) {return &table->element[addr];}addr = (addr + 1) % table->size;} while (addr != tmp);return NULL;
}void HashFree(HASH_TABLE *table) {if (table == NULL) {return;}if (table->element != NULL) {free(table->element);}free(table);
}#define MAX_TABLE_LEN 100000int* twoSum(int* nums, int numsSize, int target, int* returnSize){int i;int *rst = NULL;HASH_TABLE *table = NULL;NODE *node = NULL;rst = (int *)malloc(sizeof(int) * 2);if (rst == NULL) {*returnSize = 0;return NULL;}memset(rst, 0, sizeof(int) * 2);table = HashTableInit(MAX_TABLE_LEN);if (table == NULL) {*returnSize = 0;return NULL;}for (i = 0; i < numsSize; i++) {node =  HashFind(table, target - nums[i]);if (node != NULL) {rst[0] = node->index;rst[1] = i;break;}HashInsert(table, i, nums[i]);}HashFree(table);*returnSize = 2;return rst;
}

力扣题目系列:1. 两数之和相关推荐

  1. 力扣热门100题——两数之和(最全解法)

    1.两数之和 1.问题描述 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那两个整数,并返回它们的数组下标. 你可以假设每种输入只会对应一 ...

  2. 【力扣】NO.1.两数之和

    题目:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,数组中同一个元素不能使用两遍. ...

  3. 【力扣网练习题】两数之和

    给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样的元 ...

  4. 【力扣日记】018 四数之和

    题目描述: 给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等 ...

  5. leetcode系列--1.两数之和

    leetcode 第1题 两数之和 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标. 你可以假设每种输 ...

  6. 力扣每日一题——两数相加II

    发现做的题难度始终不高,今天Leecode给了一个稍微难一点的题目.(前两天没更是因为去拔牙了~~>_<~~) 给你两个 非空 链表来代表两个非负整数.数字最高位位于链表开始位置.它们的每 ...

  7. C# 算法题系列(一) 两数之和、无重复字符的最长子串

    题目一 原题链接 https://leetcode-cn.com/problems/two-sum/ 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整 ...

  8. 力扣题目——88. 合并两个有序数组

    注:本文的实现思路主要是基于JS(JavaScript),涉及到的一些函数都是JS中的自带函数 题目描述 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ...

  9. 力扣刷题:四数之和(C++)

    给你一个由 n 个整数组成的数组 nums ,和一个目标值 target .请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] ( ...

  10. 代码随想录算法训练营第六天|242. 有效的字母异位词,349. 两个数组的交集,202.快乐数,1. 两数之和

    242. 有效的字母异位词 力扣题目链接 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词. 示例 1: 输入: s = "anagram", t = ...

最新文章

  1. 18-flutter的Future和FutureBuilder
  2. SPI及其工作原理浅析
  3. fastadmin html模板,fastadmin 使用记录
  4. NET面试题:C#中的lock关键字有何作用
  5. 国内外免费电子书(数学、算法、图像、深度学习、机器学习)
  6. 白鹭引擎助力《迷你世界》研发团队开发3D小游戏版
  7. 使用Spring的Hibernate构建Java Web应用程序
  8. C#实现的UDP收发请求工具类实例
  9. Bootstrap模态出现在背景下
  10. unity 字体width_Unity制作自定义字体的两种方法
  11. 【机器学习】网格搜索、随机搜索和贝叶斯搜索实用教程
  12. 用户流失数据分析报告
  13. python语言培训是密封式的吗
  14. UE4 UI界面的层级切换
  15. 工控安全与传统安全区别
  16. 微信界面Android实现
  17. Powershell 数字转大写中文,数字金额转中文繁体(改自C#)
  18. LCD1602液晶显示屏的字符显示
  19. 【进制转换】负进制转换 多进制转换
  20. TCP:三次握手:URG、ACK、PSH、RST、SYN、FIN 分别代表什么

热门文章

  1. C++的string类
  2. nginx-upload-module模块实现文件断点续传
  3. 彻底抛弃脚本录制,LR脚本之使用web_custom_request函数自定义http请求
  4. 值得看的youtube频道
  5. JavaWeb-MVC模式概述
  6. 【LeetCode】【字符串】题号:242. 有效的字母异位词
  7. seaborn 绘图sns.relplot
  8. PHP数据库统计时间戳按天分组输出数据
  9. java中的implements如何打开_Java 中extends与implements使用方法
  10. 微服务与虚拟化技术博客总结