博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C语言 LeetCode two sum 问题和 实现一个mySqrt函数
阅读量:3968 次
发布时间:2019-05-24

本文共 4084 字,大约阅读时间需要 13 分钟。

前言

我在leetcode 网站上做的题,有些东西真的很坑

在它的网站上做,它会给你个函数让你实现一个功能,提醒一下,你不要更改它给你的那个函数参数,函数返回值,不用你自己写main()函数,(第一天不知道很悲催欲哭无泪啊)

第一题

题目

实现 int sqrt(int x) 函数。

计算并返回 x 的平方根,其中 x 是非负整数。

由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。

来源:力扣(LeetCode)

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

我的答案

int mySqrt(int x){  if(x<= 0) return 0;  if(x == 1) return 1;  int tmp = x;    for(unsigned int i = 0;i< tmp/2;i++){    if(i*i < tmp && (i+2)*(i+2) > tmp){        return i+1;    }  }  return 0;}

这个答案真的很菜,但是我当时就是这么做的,我感觉我算法是白学了

优化的答案

这个是用二分法做的,二分法我是会的,但是没有想到,还是对算法理解的不够深刻

//每次都取中间的值进行乘法与x比较

int mySqrt(int x) {    int start = 0;    int end = x;    long long middle = 0;    long long ret = 0;    while(start <= end){        middle = (end + start) / 2;        ret = middle * middle;        if (ret == x) {            return middle;        }        else if(ret > x){            end = middle - 1;        }        else  if (ret < x) {            start = middle + 1;        }    }        //如果最后ret > x 就取middle-1    if (ret > x) {        return middle - 1;    }else{        return middle;    }   }

第二题

题目

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

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。

来源:力扣(LeetCode)

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

我的答案

/*nums - 数组 numsSize - nums数组的个数target - 目标值returnSize - 这个不是要保存返回他们的数组下标的这只是说明要返回几个元素的*/int* twoSum(int* nums, int numsSize, int target, int* returnSize){
int start = 1; int* ret = (int*)malloc(sizeof(int)*2); for(int i = 0; i< numsSize-1;i++){
for( int j = i+1; j< numsSize ; j++){
if(nums[i] + nums[j] == target){
ret[0] = i; ret[1] = j; *returnSize = 2; return ret; } } } *returnSize = 0; return ret;}

这个答案没有算法可言,把不好的答案发出来也是对自己的激励吧,

优化的答案

我做的时候想到用哈希表,但是我不知道怎么用,没有想到用nums[i]下标中的元素做为键值用下标作为数据存储

我看到的优化答案使用散列法,基本原理都是一样的;我也是受人家的启发,想到用nums[i]下标中的元素做为键值用下标作为数据存储,我做了一个简易的哈希表没有清理资源,只写了这个功能需要用到的,

#define MAX_SIZE 1024typedef struct _element {
//头结点不储存数据 int length;//只在头结点中变化用于记录这个哈希桶有多少节点 int key;//键值 int data;//数据 struct _element* next;}element;typedef struct _Hash {
element** arr;//储存头结点的数组 int hashPill;//哈希桶的个数}Hash;//哈希函数,int HashFun(Hash* H,int key) {
return (key % H->hashPill);}void initHash(Hash* H,int hashPillSize = MAX_SIZE) {
H->hashPill = hashPillSize; H->arr = (element**)malloc(sizeof(element*) * H->hashPill); for (int i = 0; i < H->hashPill; i++) {
H->arr[i] = (element*)malloc(sizeof(element)); memset(H->arr[i], 0, sizeof(element)); }} void pushHash(Hash* H,int key,int data){
element* node = (element*)malloc(sizeof(element)); node->key = key; node->data = data; int k = HashFun(H, key); H->arr[k]->length++; node->next = H->arr[k]->next; H->arr[k]->next = node; }int* findHash(Hash* H, int key,int* length) {
int k = HashFun(H, key); int* ret = (int*)malloc(sizeof(int) * H->arr[k]->length); *length = H->arr[k]->length; element* tmp = H->arr[k]->next; int i = 0; while (tmp) {
ret[i] = tmp->data; i++; tmp = tmp->next; } return ret; }int* twoSum(int* nums, int numsSize, int target, int* returnSize) {
int i; int length = 0; int* ret =NULL; int* res = (int*)malloc(sizeof(int)*2); Hash h; initHash(&h); for ( i = 0; i < numsSize; i++) {
pushHash(&h, nums[i], i); } for (i = 0; i < numsSize; i++) {
ret = findHash(&h, target-nums[i],&length); if (ret) {
for (int j = 0; j < length; j++) {
if (ret[j] != i) {
res[0] = ret[j]; res[1] = i; *returnSize = 2; free(ret); return res; } } } } free(ret); return res;}

总结

就这二个题让我感触良多啊,这二个题很都是简单的,都让我学到了很多,学到了知识,还是需要实践的还有就是之前太过于依赖于VS2019的强大功能以至于我基本函数都忘记了怎么敲

你可能感兴趣的文章
NET - NET Core中使用Log4net输出日志到数据库中去
查看>>
NET - NET Core 迁移nuget包缓存到指定位置
查看>>
Spring - SpringBoot 集成 swagger2
查看>>
SQL - 深入理解MySQL索引之B+Tree
查看>>
SQL - 数据库索引原理,及MySQL索引类型
查看>>
Spring - Dubbo的实现原理
查看>>
Spring - Dubbo 扩展点详解
查看>>
Spring - Hystrix原理与实战
查看>>
Spring - Sentinel 原理 全解析
查看>>
Spring - 比较Sentinel和Hystrix
查看>>
Spring - Nacos 服务注册与发现原理分析
查看>>
Spring - Nacos 配置中心原理分析
查看>>
Spring - Nacos 配置实时更新原理分析
查看>>
Android开发MVP模式(解决了View和Model的耦合)
查看>>
Android网络框架Volley(实战篇)
查看>>
Android 常见分辨率(mdpi、hdpi 、xhdpi、xxhdpi )及屏幕适配注意事项
查看>>
Android 5.0学习之感想篇(含Demo)
查看>>
ViewPagerindicator 源码解析
查看>>
HoloGraphLibrary 源码解析
查看>>
CircularFloatingActionMenu 源码解析
查看>>