1 写作计划

最近在看《剑指offer》,发现自己有很多的数据结构与算法的基础知识要复习,《好书一起读(131):让写作更好》中提到用写作倒逼阅读,我很是赞同。所以,计划以《剑指offer》为中心,以记录复习心得目的,写一系列数据结构与算法的文章。

  • 文章结构

文章从概念介绍切入,接着介绍相关的语言细节(以C语言和Python为主),最后以《剑指offer》中的编程题做结。

2 什么是数组

一提到数组,我第一时间经典的C语言实现和与之对应的一片定长连续的内存空间。数组的读写操作很快,时间复杂度为o(1),但是因其必须事先指定长度,所以空间利用率不高。数组的下标是数组中元素的标识,可以当做元素的身份证使用,在需要记录大量数据时,要利用好数组下标。

3 C语言细节

该节分3个部分介绍C语言从数组的必要语言细节。

3.1 数组越界问题

C语言不强制检查数组下标是否越界,使用时应时刻注意越界问题。

这个是一个毫无意义的问题,因为C语言根本不允许数组越界。

数组越界是一种Undefined behavior,C语言没规定程序运行结果,编译器也不保证这个结果。C语言规定这种错误编译器不必指出,所以编译可能会正常通过,但这依然是一种错误,且责任在CODER。

因此这是一个毫无意义的问题,就如同问袜子炖茄子会是什么味道。只有傻逼才会用袜子炖茄子然后亲自尝尝——这就是那个“解答”的本质。

作者:薛非

链接:https://www.zhihu.com/question/22897368/answer/22999166

来源:知乎

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

3.2 数组与指针

本节介绍数组与指针之间的关系以及数组在使用中的注意点。

数组名是特殊的指针

本节介绍数组与指针的共同点和不同点。

以数组int a[10];为例:

int a[10];

int n = 10;
int a[n]; //定义数组时,长度不可以为变量,该语句非法

共同点:通过指针访问数组元素

  • a[i]*(a+i)&a[i]a+i都是等价的。
  • 通过等价指针访问数组
int *pa;
pa = &a[0]; //指针pa指向数组的0元素地址
pa = a; //这个写法和上句等价 x = *(pa+1);
x = a[1]; //这两句赋值语句等价

不同点:数组名与指针的区别

指针是一个变量,但是数组名不是变量。

int *pa;
pa = &a[0]; //指针pa是可以被赋值的,其指向地址可以改变 int b[10];
a = b; //a不可以被赋值,该语句非法

函数中传递的数组是指针(地址)

  • 以《剑指offer》中的代码为例:
int GetSize(int data[])
{
return sizeof(data);
} int main()
{
int data1[] ={1, 2, 3, 4, 5};
int size1 = sizeof(data1); //此处求数组data1所占字节数 int *data2 = data1;
int size2 = sizeof(data2); //此处求指针data2所占字节数 int size3 = GetSize(data1); //data1的地址被赋值给了局部变量data,所以返回指针data所占字节数 printf("%d, %d, %d", size1, size2, size3);
}
//输出结果为:20, 4, 4
  • 传递部分数组

    利用数组以指针形式传递的特性,我们可以数组的后本部分给函数。如f(&a[3])f(a+3),将数组a的后7个元素传递给了函数f。

3.3 数组与哈希表

数组可以看做一个简单的哈希表,其哈希函数为\(h(k)=k\),\(k\)为元素的关键字key。

常用的哈希函数有:

  1. 除法哈希法

\[h(k)=k mod m
\]

不太接近2的整数幂的素数适合作为\(m\)的值

2. 乘法哈希法

\[h(k)=\lfloor m(kA mod 1) \rfloor
\]

其中\((kA mod 1)\)是取\(kA\)的小数部分,即\(kA- \lfloor kA \rfloor\)。

建议的变量取值为:\(m=2^p, p为大于0的整数\);\(A \approx (\sqrt 5 - 1)/2 \approx 0.618\)。

3. 全域哈希法

随机地选择哈希函数,使之独立于要存储的关键字。在此不做详细介绍。

4 编程题

Python:

# -*- coding:utf-8 -*-
class Solution:
# array 二维列表
def Find(self, target, array):
# write code here
r, c = len(array), len(array[0])
i, j = 0, c - 1 //选择合适的开始位置,右上角和左下角都可以
while (i < r and j >= 0):
if target < array[i][j]:
j = j - 1
elif target > array[i][j]:
i = i + 1
else:
return True
return False //之前将return放在while循环中,一直通不过

C语言:

C语言的实现和Python大同小异,牛客网的OJ系统貌似不支持C语言,此处略过。

5 结语

正如《黑客与画家》所说,编程语言是程序员的思考方式。思考问题的方式是在具体语言的基础上进行的,如数组,用C语言思考,我看到的是一片定长连续的内存空间;用Python思考,我看到是随意组合操作的不定长序列,学习不同的语言可以从不同的角度理解同一个概念,打破自己的思维局限。

剑指offer(1):数组的更多相关文章

  1. 剑指Offer:数组中出现次数超过一半的数字【39】

    剑指Offer:数组中出现次数超过一半的数字[39] 题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如,输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于这 ...

  2. 《剑指offer》数组中只出现一次的数字

    本题来自<剑指offer> 数组中只出现一次的数字 题目: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 思路: 思路一:在<剑指of ...

  3. 剑指 Offer 51. 数组中的逆序对 + 归并排序 + 树状数组

    剑指 Offer 51. 数组中的逆序对 Offer_51 题目描述 方法一:暴力法(双层循环,超时) package com.walegarrett.offer; /** * @Author Wal ...

  4. 剑指 Offer 39. 数组中出现次数超过一半的数字 + 摩尔投票法

    剑指 Offer 39. 数组中出现次数超过一半的数字 Offer_39 题目描述 方法一:使用map存储数字出现的次数 public class Offer_39 { public int majo ...

  5. 剑指 Offer 03. 数组中重复的数字

    剑指 Offer 03. 数组中重复的数字 找出数组中重复的数字. 在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知 ...

  6. 菜鸟刷题路:剑指 Offer 03. 数组中重复的数字

    剑指 Offer 03. 数组中重复的数字 哈希表/set class Solution { public int findRepeatNumber(int[] nums) { HashSet< ...

  7. 剑指 Offer 39. 数组中出现次数超过一半的数字

    剑指 Offer 39. 数组中出现次数超过一半的数字 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 你可以假设数组是非空的,并且给定的数组总是存在多数元素. 示例 1: 输入: [ ...

  8. 5.1 剑指 Offer 03. 数组中重复的数字

    类型题:剑指 Offer 03. 数组中重复的数字 找出数组中重复的数字.在一个长度为 n 的数组 nums 里的所有数字都在 0-n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了, ...

  9. 力扣 - 剑指 Offer 39. 数组中出现次数超过一半的数字

    题目 剑指 Offer 39. 数组中出现次数超过一半的数字 思路1(排序) 因为题目说一定会存在超过数组长度一半的一个数字,所以我们将数组排序后,位于length/2位置的一定是众数 代码 clas ...

  10. 【剑指Offer】数组中只出现一次的数字 解题报告(Python)

    [剑指Offer]数组中只出现一次的数字 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-intervie ...

随机推荐

  1. DRF之三大认证

    一.用户认证Authorticatons 1.源码解析 第一步. 找入口 def dispatch(self, request, *args, **kwargs): # 1.首先我们进入的是APIVi ...

  2. Nginx中配置https中引用http的问题

    Nginx中配置https中引用http的问题 遇到问题: 今天公司要在后台增加直播入口,使用腾讯云的实时音视频,要求是必须使用https,在配置完强制跳转https候,发现后台无法上传图片,在浏览器 ...

  3. nginx_mirror_module流量复制在项目中的应用

    参考文档:https://my.oschina.net/andChow/blog/2873870 https://blog.csdn.net/lancerh/article/details/88645 ...

  4. Comet OJ - 模拟赛 #2 Day1 比赛总结

    比赛情况 40 + 60 + 0 = 100pts 哎,T1做错了,没有对拍.如果发现错误 \(=>\) 改正 \(=>\) 40->100pts,160pts \(=>\) ...

  5. Kafka---系统学习

    1.Topics 1.1.Topic  就是  数据主题: 1.2.作用:数据记录  发布的地方,用来  区分 业务系统: 1.3.每个Topic  可以有多个 消费者 订阅它的数据: 1.4.每个T ...

  6. vue的.sync 修饰符

    很多时候,我们会对 prop (父子组件传递数据的属性) 进行“双向绑定” 在vue 1.x 中的 .sync 修饰符所提供的功能.当一个子组件改变了一个带 .sync 的prop的值时,这个变化也会 ...

  7. js-进度条-动画

    效果图如下:       HTML: <h1>js实现进度条</h1> <div id="warp"> <div id="inn ...

  8. Day_02-Python的分支结构和循环结构

    分支结构 应用场景 迄今为止,我们写的Python代码都是一条一条语句顺序执行,这种结构的代码我们称之为顺序结构.然而仅有顺序结构并不能解决所有的问题,比如我们设计一个游戏,游戏第一关的通关条件是玩家 ...

  9. HTML和CSS实现图片翻转效果

    实现图片翻转,首先来分析一下我们希望实现的是怎样的翻转效果?又该如何去实现呢? 一.希望实现的效果 页面上的图片在光标悬停在上面的时候会发生翻转效果,翻转过后显示出背面的说明文字. 鼠标没有悬停在上面 ...

  10. 舞蹈课(dancingLessons)

    有n个人参加一个舞蹈课.每个人的舞蹈技术由整数ai来决定.在舞蹈课的开始,他们从左到右站成一排.当这一排中至少有一对相邻的异性时,舞蹈技术相差最小的那一对会出列并开始跳舞.如果相差最小的不止一对,那么 ...