前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >剑指 Offer 总结

剑指 Offer 总结

作者头像
离殊
发布于 2022-05-31 02:44:15
发布于 2022-05-31 02:44:15
23400
代码可运行
举报
文章被收录于专栏:DingLin 随笔DingLin 随笔
运行总次数:0
代码可运行

1: 实现 Singleton (单例) 模式

题目:设计一个类,我们只能生成该类的一个实例。

单例模式的定义是:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Modal 类
class Modal {
  constructor(message) {
    this.message = message;
  }

  get getMessage() {
    return this.message;
  }
}

// 通过代理设计模式
// 使用闭包实现
const SingletonModal = (function () {
  let instance = null;
  return class SingletonModal {
    constructor(message) {
      if (instance === null) {
        instance = new Modal(message);
      }

      return instance;
    }
  };
})();

const Singleton1 = new SingletonModal("Singleton1");
const Singleton2 = new SingletonModal("Singleton2");

console.log(Singleton1 === Singleton2); // true
console.log(Singleton1.getMessage); // Singleton1
console.log(Singleton2.getMessage); // Singleton1

#2: 数组中重复的数字

题目一:找出数组中重复的数字

在一个长度为 n 的数组里的所有数字都在 0 ~ n - 1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。

例如,如果输入长度为 7 的数组 [2, 3, 1, 0, 2, 5, 3]

那么对应的输出是重复的数字 2 或者 3。

如不包含返回 false,如无效空指针返回 false

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function duplicate(numbers) {
  if (!Array.isArray(numbers) && numbers !== null) return false;
  const length = numbers.length;

  // 如果值大于元素下标,返回 false
  for (let i = 0; i < length; ++i) {
    if (numbers[i] > length - 1) {
      return false;
    }
  }

  for (let i = 0; i < length; ++i) {
    while (i !== numbers[i]) {
      if (numbers[i] === numbers[numbers[i]]) {
        return numbers[numbers[i]];
      }
      let temp = numbers[i];
      numbers[i] = numbers[temp];
      numbers[temp] = temp;
    }
  }

  return false;
}
duplicate([2, 3, 1, 0, 2, 5, 3]); // 2
duplicate([1, 2, 3, 5]); // false
duplicate([1, 2, 3]); // false

题目二:不修改数组找出重复的数字

在一个长度为 n+1 的数组里的所有数字都在 1~n 的范围内,所以数组中至少有一个数字是重复的。请找出数组中任意一个重复的数字,但不能修改输入的数组。

例如,如果输入长度为 8 的数组 [2, 3, 5, 4, 3, 2, 6, 7]

那么对应的输出是重复的数字 2 或者 3。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 时间 O(n) 空间 O(n)
function duplicate(numbers) {
  if (numbers.length === 0) return false;

  const arr = [];
  for (let i = 0; i < numbers.length; ++i) {
    if (arr.includes(numbers[i])) {
      return numbers[i];
    }
    arr.push(numbers[i]);
  }

  return false;
}

const arr = [2, 3, 5, 4, 3, 2, 6, 7];
console.log(duplicate(arr));
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 时间 O(nlogn) 空间 O(1)
function duplicate(numbers) {
  if (numbers.length <= 0) return -1;

  let start = 1;
  let end = numbers.length - 1;

  while (end >= start) {
    let middle = ((end - start) >> 1) + start;

    let count = countRange(numbers, start, middle);
    if (end === start) {
      if (count > 1) {
        return start;
      } else {
        break;
      }
    }

    if (count > middle - start + 1) {
      end = middle;
    } else {
      start = middle + 1;
    }
  }
  return -1;
}

function countRange(numbers, start, end) {
  if (numbers.length === 0) return 0;

  let count = 0;
  for (let i = 0; i < numbers.length; ++i) {
    if (numbers[i] >= start && numbers[i] <= end) {
      ++count;
    }
  }
  return count;
}

const arr = [2, 3, 5, 4, 3, 2, 6, 7];
console.log(duplicate(arr));

#3: 二维数组中的查找

题目描述

在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

例如下面的二维数组就是每行、每列都递增排序。如果在这个数组中查找数字 7,则返回 true;如果查找数字 5 ,由于数组不含有该数字,则返回 false。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const arr = [
  [1, 2, 8, 9],
  [2, 4, 9, 12],
  [4, 7, 10, 13],
  [6, 8, 11, 15],
];

function find(arr, num) {
  let row = 0
  let column = arr.length - 1
  let found = false

  while(row < arr.length && row >= 0 && column >= 0) {
    const rightTop = arr[row][column]
    if (rightTop === num) {
      found = true
      break
    } else if (rightTop > num) {
      --column
    } else {
      ++row
    }
  }
  return found
}

find(arr, 7)

思考:我们也可以选取左下角的数字。但我们不能选择左上角数字或者右下角数字。以左上角数字为例,最初数字 1 位于初始数组的左上角,由于 1 小于 7,那么 7 应该位于 1 的右边或者下边。此时我们既不能从查找范围内剔除 1 所在的行,也不能剔除 1 所在的列,这样我们就无法缩小查找范围。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const arr = [
  [1, 2, 8, 9],
  [2, 4, 9, 12],
  [4, 7, 10, 13],
  [6, 8, 11, 15],
];

function find(arr, num) {
  let row = arr.length - 1
  let column = 0
  let found = false

  while(column < arr.length && row >= 0 && column >= 0) {
    if (arr[row][column] === num) {
      found = true
      break
    } else if (arr[row][column] < num) {
      ++column
    } else {
      --row
    }
  }

  return found
}

find(arr, 7)
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-04-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
Go的代码规范指南-新人必看
环境设置:*nix环境或者Mac环境,安装go语言目录,默认是usr/local/go,如果想要让代码运行,需要将项目放到usr/local/go/src目录下,如果忘记了go的配置目录,可以通过go env查看go的环境变量设置。如果不希望每次使用sudo权限执行,可以通过设置用户目录下创建~/.bashrc文件,增加 用户目录的环境变量设置比如
小诚信驿站
2019/10/01
1.9K0
Go的代码规范指南-新人必看
常用Golang工具类函数实现(二)
在使用Golang开发中,标准库提供了很多好用的函数可以帮助我们快速的实现一些功能。但是相对于其他语言来说,还是有很多好用且常用的函数或者方法,是没有被加入到标准库的,这里就需要我们自己的来实现。
KunkkaWu
2023/08/10
6250
常用Golang工具类函数实现(二)
golang struct转化成map
现在介绍的反射的方式,其中需要注意的是,反射不能够获取struct中没有被暴露出的变量(小写开头的变量)。
Java架构师必看
2021/05/14
6790
Go 每日一库之 testify
testify可以说是最流行的(从 GitHub star 数来看)Go 语言测试库了。testify提供了很多方便的函数帮助我们做assert和错误信息输出。使用标准库testing,我们需要自己编写各种条件判断,根据判断结果决定输出对应的信息。
用户7731323
2021/08/20
1.9K0
使用 Golang 正确处理五大互联网注册机构的 IP 数据
上个月,我写了一篇文章《正确处理全球五大互联网注册机构的 IP 数据》,来介绍如何处理全球五大互联网注册机构所提供的 IP 数据。
soulteary
2022/07/16
4150
使用 Golang 正确处理五大互联网注册机构的 IP 数据
Golang fasthttp实践
原计划学完Golang语言HTTP客户端实践之后,就可以继续了,没想到才疏学浅,在搜资料的时候发现除了Golang SDK自带的net/http,还有一个更牛的HttpClient实现github.com/valyala/fasthttp,据说性能是net/http的10倍,我想可能是有点夸张了,后期我会进行测试,以正视听。
FunTester
2021/10/22
4.1K0
Golang单元测试
Go提供了test工具用于代码的单元测试,test工具会查找包下以_test.go结尾的文件,调用测试文件中以 Test或Benchmark开头的函数并给出运行结果
仙人技术
2021/08/31
8250
Golang单元测试
Go语言实战笔记(二十一)| Go 单元测试
相信我们做程序员的,对单元测试都不陌生。单元测试一般是用来测试我们的代码逻辑有没有问题,有没有按照我们期望的运行,以保证代码质量。
飞雪无情
2018/08/28
7420
Go语言实战笔记(二十一)| Go 单元测试
Go 单测入门篇:Golang 单元测试基本使用
Go 语言的单元测试默认采用官方自带的测试框架,通过引入 testing 包以及 执行 go test 命令来实现单元测试功能。
Allen.Wu
2023/03/01
1.4K0
Go 单测入门篇:Golang 单元测试基本使用
golang源码阅读:test2json
go test加参数-json就能输出 json格式,下面我们用一个简单的例子看下对他进行分析,然后分析下相关源码。对于单测
golangLeetcode
2023/09/06
1880
golang源码阅读:test2json
Go每日一库之112:asynq
Asynq是一个go语言实现的分布式任务队列和异步处理库,基于redis,类似sidekiq和celery,他具有以下特点:
luckpunk
2023/09/30
1.4K0
Go单测系列2—网络测试
这是Go语言单元测试从零到溜系列教程的第1篇,介绍了如何使用httptest和gock工具进行网络测试。
luckpunk
2023/09/10
4700
常用Golang工具类函数实现(一)
在使用Golang开发中,标准库提供了很多好用的函数可以帮助我们快速的实现一些功能。但是相对于其他语言来说,还是有很多好用且常用的函数或者方法,是没有被加入到标准库的,这里就需要我们自己的来实现。
KunkkaWu
2023/08/10
6720
常用Golang工具类函数实现(一)
PHP转Go速学手册
整理了一份简要的手册,帮助大家高效的上手Go语言,主要是通过对比PHP和Go的不同点来强化理解,内容主要分为以下四部分:
用户1093396
2021/07/28
2.3K0
golang--单元测试综合实例
(2)Monster有一个Store方法,可以将一个Monster对象序列化后保存在文件中;
西西嘛呦
2020/08/26
3370
Go语言——测试与性能
​ 作为一名合格的开发者,不应该在程序开发完之后才开始写测试代码。使用 Go 语言的测试 框架,可以在开发的过程中就进行单元测试和基准测试。和 go build 命令类似,go test 命 令可以用来执行写好的测试代码,需要做的就是遵守一些规则来写测试。而且,可以将测试无缝 地集成到代码工程和持续集成系统里。
传说之下的花儿
2023/04/16
1.2K0
Go单测系列5—使用monkey打桩
这是Go语言单元测试从零到溜系列教程的第4篇,介绍了如何在单元测试中使用monkey进行打桩。
luckpunk
2025/01/18
900
Go每日一库之79:testing
testing是 Go 语言标准库自带的测试库。在 Go 语言中编写测试很简单,只需要遵循 Go 测试的几个约定,与编写正常的 Go 代码没有什么区别。Go 语言中有 3 种类型的测试:单元测试,性能测试,示例测试。下面依次来介绍。
luckpunk
2025/01/18
650
Go语言JSON 处理
struct能被转换的字段都是首字母大写的字段,但如果想要在json中使用小写字母开头的key,可以使用struct的tag来辅助反射。
王小明_HIT
2021/10/11
8920
Go test 单元测试用起来
单元测试,咱们平时也叫它单测,平时开发的时候,也需要写一些 demo 来测试我们的项目中的函数或者某个小功能
阿兵云原生
2023/02/16
2560
相关推荐
Go的代码规范指南-新人必看
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档