算法-数学题

目录

  • 50. Pow(x, n)
  • 54. 螺旋矩阵
  • 剑指 Offer 10- I. 斐波那契数列
  • 169. 多数元素
    • 剑指 Offer 39. 数组中出现次数超过一半的数字
  • 191. 位1的个数
  • 剑指 Offer 15. 二进制中1的个数
  • 剑指 Offer 56 - I. 数组中数字出现的次数
  • 剑指 Offer 56 - II. 数组中数字出现的次数 II
  • 剑指 Offer 58 - II. 左旋转字符串
  • 剑指 Offer 61. 扑克牌中的顺子

1. &:任何数&1都会得到这个数本身
(1)可将某数的某一位与1来获得相应位
(2)n&1等价于n%2是否等于0
(3)n&(n-1)可以把n的最后一个1变为0 即把n中最低位的1变为0 并保持其他位不变
(4)负数x的补码是反码加1 即x=x取反+1 此操作相当于将x所以位取反 但最右边的1除外 所以x与-x只有一个共同点:最右边的1相等 所以x&(-x)将保留最右边的1 并将其他位设为0
2. 异或^:两个数相同为0 不相同为1

50. Pow(x, n)

实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。

示例 1:
输入:x = 2.00000, n = 10
输出:1024.00000
示例 2:
输入:x = 2.10000, n = 3
输出:9.26100
示例 3:
输入:x = 2.00000, n = -2
输出:0.25000
解释:2-2 = 1/22 = 1/4 = 0.25

解:例如:
x64=x32*x32
x65=x32*x32*x
所以我们可以先递归地计算出 y = x(n/2),如果n为偶数,那么 xn = y2;如果n为奇数,那么 xn = y2 * x,例如假设要计算x64 先递归计算出x32 此时n=64为偶数 所以答案为x32的平方=x32*x32 若计算x65 先递归计算出x32 此时n=65为奇数 所以答案为x32的平方*x=x32*x32*x
还要记得判断n的正负
注:下面这行语句可以用来判断n是否为奇数 若n的最低为为1 则是奇数 则(n & 1) === 1

boolean odd = (n & 1) === 1;// 判断odd是否是奇数 为true则是

代码如下:
JS:

var myPow = function(x, n) {if (n === 1) return x;if (n === -1) return 1 / x;if (n === 0) return 1;let odd = false;let smaller = false;let m = x;let res;if (n < 0) {n = 0 - n;smaller = true;}if (n % 2 === 1) {//奇数odd = true;n--;}let count = n / 2;res = myPow(x, count);res *= res;res = odd ? res * m : res;res = smaller ? 1 / res : res;return res;
};

54. 螺旋矩阵

给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

示例1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
示例2:
输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]

解:在这里插入图片描述
在这里插入图片描述
按照图中顺时针一层层遍历就行 需要4个指针 分别表示上下左右 用来定位到哪一层
代码如下:
JS:

var spiralOrder = function(matrix) {let ans = [];let l = 0;let r = matrix[0].length;let t = 0;let b = matrix.length;while (l < r && t < b) {for (let j = l; j < r; j++) {ans.push(matrix[t][j]);}t++;for (let j = t; j < b; j++) {ans.push(matrix[j][r - 1]);}r--;if (l >= r || t >= b) break;for (let j = r - 1; j >= l; j--) {ans.push(matrix[b - 1][j]);}b--;for (let j = b - 1; j >= t; j--) {ans.push(matrix[j][l]);}l++;}return ans;
};

JAVA

private static List<Integer> spiralOrder(int[][] matrix) {List<Integer> list = new LinkedList<>();if (matrix == null || matrix.length == 0) return list;int left = 0;int right = matrix[0].length - 1;int top = 0;int bottom = matrix.length - 1;while (left <= right && top <= bottom){for (int i = left; i <= right; i++) {list.add(matrix[top][i]);}top++;for (int i = top; i <= bottom; i++) {list.add(matrix[i][right]);}right--;if (top > bottom || left > right) break;for (int i = right; i >= left ; i--) {list.add(matrix[bottom][i]);}bottom--;for (int i = bottom; i >= top; i--) {list.add(matrix[i][left]);}left++;}return list;}

剑指 Offer 10- I. 斐波那契数列

写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下:
F(0) = 0, F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。
答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
解:由于fib的第i项只与第i-1和第i−2项有关,因此只需要初始化三个整形变量 l1,l2,l3,l3代表fib(n)的值 了代表fib(n - 2)的值 l3代表fib(n - 1)的值 只需要推进l1 l2 l3即可
代码如下:
JS:

var fib2 = function(n) {if (n === 0) return 0;if (n === 1) return 1;let l1,l2,l3;l1 = 0;l2 = 1;for (let i = 2; i <= n; i++) {l3 = (l1 + l2) % 1000000007;l1 = l2;l2 = l3;}return l3;
}

169. 多数元素

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

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
解:数组排序后返回中间那个数
代码如下:
JS:

var majorityElement = function(nums) {nums.sort();return nums[Math.floor(nums.length / 2)];
};

191. 位1的个数

剑指 Offer 15. 二进制中1的个数

编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量)。

输入:00000000000000000000000000001011
输出:3
解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 ‘1’。
示例 2:
输入:00000000000000000000000010000000
输出:1
解释:输入的二进制串 00000000000000000000000010000000 中,共有一位为 ‘1’。
示例 3:
输入:11111111111111111111111111111101
输出:31
解释:输入的二进制串 11111111111111111111111111111101 中,共有 31 位为 ‘1’。

解:n & (n−1)的运算结果为把 n 的二进制位中的最低位的 1 变为 0 之后的结果。这样我们不断让当前的 n 与 n−1 做&运算,直到 n 变为 0。因为每次运算会使得 n 的最低位的 1 被翻转,因此运算次数就等于 n 的二进制位中 1 的个数。
代码如下:
JS:

var hammingWeight = function(n) {let ret = 0;while (n) {n &= n - 1;ret++;}return ret;
};

剑指 Offer 56 - I. 数组中数字出现的次数

一个整型数组里除了两个数字只出现一次,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。

示例 1:
输入:nums = [4,1,4,6]
输出:[1,6] 或 [6,1]
示例 2:
输入:nums = [1,2,10,4,1,4,3,3]
输出:[2,10] 或 [10,2]

解:先对所有数字进行一次异或,得到两个出现一次的数字的异或值。在异或结果中找到任意为 11 的位。根据这一位对所有的数字进行分组。在每个组内进行异或操作,得到两个数字。

剑指 Offer 56 - II. 数组中数字出现的次数 II

在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。

示例 1:
输入:nums = [3,4,3,3]
输出:4
示例 2:
输入:nums = [9,1,7,9,7,9,7]
输出:1

解:建立一个长度为 32 的数组counts,记录所有数字的各二进制位的1出现次数。将counts各元素对3求余,则结果为 “只出现一次的数字” 的各二进制位。利用 左移操作 和 或运算 ,可将counts数组中各二进位的值恢复到数字res上
实际上,只需要修改求余数值m,即可实现解决 除了一个数字以外,其余数字都出现m次的通用问题。

剑指 Offer 58 - II. 左旋转字符串

字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。

示例 1:
输入: s = “abcdefg”, k = 2
输出: “cdefgab”
示例 2:
输入: s = “lrloseumgh”, k = 6
输出: “umghlrlose”

解:
方法一:使用内部方法进行拼接:

function LeftRotateString(str, n) {return str.slice(n) + str.slice(0,n);
}

方法二:遍历添加到新的字符串

var reverseLeftWords = function(s, n) {let str = "";for (let i = n; i < s.length; i++) {str += s.charAt(i);}for (let i = 0; i < n; i++) {str += s.charAt(i);}return str;
};

遇到【到尾端就要从头开始】的,基本都可以用取余来操作,i是线性增长,通过取余可以让线性增长的数据在模内循环起来
优化:

var reverseLeftWords = function(s, n) {let res = "";for(let i = n; i < n + s.length; i++) res += s.charAt(i % s.length);return res;
};

剑指 Offer 61. 扑克牌中的顺子

从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。

示例 1:
输入: [1,2,3,4,5]
输出: True
示例 2:
输入: [0,0,1,2,5]
输出: True

解:
此5张牌是顺子的 充分条件 如下:
(1)除大小王外,所有牌 无重复 ;
(2)设此5张牌中最大的牌为max ,最小的牌为min (大小王除外),则需满足:max - min < 5

var isStraight = function(nums) {nums.sort((a, b) => a - b);let count = 0;for (let i = 0; i < 4; i++) {if(nums[i] === 0) {count++;} else if (nums[i] === nums[i + 1]) return false;}return nums[4] - nums[count] < 5;
};

用set判断是否重复更高效:

var isStraight = function(nums) {/* 分治思想 五张牌构成顺子的充分条件需要满足1. 不重复 使用Set去重2. max - min < 5 最大牌值 减去 最小牌值 小于5 且跳过大小王*/const set = new Set()let min = 14, max = 0 // ⚠️ min和max的初始值是两个边界值[0, 13]for (const num of nums) {// 遇到大小王 跳过if (!num) continue// 遇到重复则直接 返回falseif (set.has(num)) return falseset.add(num)// 迭代更新 min和max 以及setmin = Math.min(min, num)max = Math.max(max, num)}return max - min < 5
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/5550.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

文心一言 VS chatgpt (15)-- 算法导论3.2 4~5题

四、函数 ⌈ lg ⁡ n ⌉ ! \lceil \lg n \rceil ! ⌈lgn⌉! 多项式有界吗&#xff1f;函数 ⌈ lg ⁡ lg ⁡ n ⌉ ! \lceil \lg \lg n \rceil ! ⌈lglgn⌉! 多项式有界吗&#xff1f; 文心一言&#xff1a; chatgpt&#xff1a; 对于第一个问题&#xff0c;函数 ⌈ lg ⁡ n…

让Chatgpt帮你出Python练习题

最近发现Chatgpt有一个很棒的功能&#xff0c;感觉是让培训机构失业呀。 你可以让Chatgpt出Python练习题&#xff0c;能涵盖任意的知识点&#xff0c;对于初学者来说简直是福音。 Chatgpt在编程上面的对话能力是好于其他场景的&#xff0c;因为编程是机器语言&#xff0c;cha…

chatgpt赋能python:用Python计算数学题,速度快效果好!

用Python计算数学题&#xff0c;速度快效果好&#xff01; 在现代化的信息时代&#xff0c;计算机已经成为了我们生活中不可缺少的工具之一。而对于数学爱好者来说&#xff0c;用计算机进行数学计算已经变得非常普遍&#xff0c;因为使用计算机能够快速解决数学难题&#xff0…

MJ基础入门之注册:超详细注册 Midjourney 及使用方法

如何注册并使用 Midjourney Midjourney是一款优秀的AI图像生成工具&#xff0c;它的综合能力十分强大且易于上手。使用Midjourney&#xff0c;您可以在一分钟内生成4张图像&#xff0c;这是非常快的。不仅如此&#xff0c;国外的很多图像创作者都在使用Midjourney&#xff0c;并…

Claude的奇妙之旅:一起探索人工智能的无限可能

是一款由Anthropic公司开发的人工智能应用&#xff0c;可以在Slack中使用。可以理解和生成自然语言&#xff0c;帮助用户完成各种任务&#xff0c;如写小说、编写代码、解释概念等。的特点是&#xff1a; - 是免费的&#xff0c;不需要申请或下载&#xff0c;只需要在Slack中添…

注册claude AI账号 slack工作区账号

Claude 是建立在 slack工作区的一个AI人工助手&#xff0c;更像是将chatgpt集成到了会议模式&#xff0c;一个账号实际上拥有了你的会议室和你的AI助手&#xff0c;你可以让你的朋友和同事进入你的房间体验。 Claude是不是openai的产物&#xff1f;目前还不知道&#xff0c;不…

idea插件 Bito – GPT-4 ChatGPT AI写代码 分析代码 生成测试用例

Bito介绍 Bito官网 https://bito.ai/ Bito AI是一款通用的人工智能辅助工具&#xff0c;基于最新的ChatGPT实现&#xff0c;开发者可以提出任何技术问题&#xff0c;根据自然语言提示生成代码。 Bito AI可以用于编写代码、理解语法、编写测试用例、分析解释代码、注释代码、…

chatgpt怎么用?对新媒体作者有什么用处?

chatgpt怎么用&#xff1f;作为一名新媒体作者&#xff0c;我认为ChatGPT是一款非常有用的工具。在这篇文章中&#xff0c;我将详细介绍ChatGPT的产品介绍、用处以及能为人们带来的好处。 一.Chatgpt是什么 ChatGPT是一款基于人工智能技术的聊天机器人&#xff0c;使用了开源…

3 分钟利用 FastGPT 和 Laf 将 ChatGPT 接入企业微信

原文链接&#xff1a;https://forum.laf.run/d/556 FastGPT 是一个超级&#x1f42e;&#x1f37a;的 ChatGPT 平台项目&#xff0c;功能非常强大&#xff1a; ✅ 集成了 ChatGPT、GPT4 和 Claude ✅ 可以使用任意文本来训练自己的知识库、文档库&#xff0c;而且知识库专有模…

亲测好用!免费英语学习版ChatGPT,国内能直接用!(内测名额有限)

ChatGPT大火几个月了 热度似乎没有减退的意思 每天见识到别人晒出最新应用截图 自己却还迟迟没有上手使用 但是&#xff0c;只要是用过它的人 都会马上承认它的魔力 聊闲天、编脚本、学面试 做总结、做翻译、写作文 只要释放几句“咒语”&#xff08;prompt&#xff09; 就能看…

chatGPT替代方案

最近chatGPT太火了&#xff0c;分享几个可用的地址 1.Edge插件Sider 打开edge外接程序界面Microsoft Edge Addons 搜索Sider ,第一个就是&#xff0c;点击获取添加到浏览器就可以使用了&#xff0c;无需魔法&#xff0c;搜索时右边栏会出现chartGPT的回答&#xff0c;非常棒 …

ChatGPT在工业领域的用法

在工业数字化时代&#xff0c;我们需要怎么样的ChatGPT&#xff1f; 近日&#xff0c;ChatGPT热度高居不下&#xff0c;强大的人机交互能力令人咋舌&#xff0c;在国内更是掀起一股讨论热潮。一时间&#xff0c;这场由ChatGPT引起的科技飓风&#xff0c;使得全球最顶尖科技力量…

ChatGPT:数字时代革新与展望

ChatGPT&#xff1a;数字时代革新与展望 AGI 未来的愿景&#xff1a;建安全有益的 AGI OpenAI团队对AGI的展望&#xff1a; 我们希望 AGI 能够赋予人类在宇宙中最大程度地繁荣发展的能力。我们不期望未来是一个不合格的乌托邦&#xff0c;但我们希望将好的最大化&#xff0c;将…

ChatGPT将改变教育,而不是摧毁它

01 学校和大学的反应迅速而果断 就在 OpenAI 于 2022 年 11月下旬发布ChatGPT 的几天后&#xff0c;该聊天机器人被广泛谴责为一种免费的论文写作、应试工具&#xff0c;它很容易在作业中作弊。 美国第二大学区洛杉矶联合大学立即阻止了OpenAI网站从其学校网络访问。其他人很…

让ChatGPT谈谈科技发展

ChatGPT谈科技发展 讲讲科技发展的那些事儿谈谈ChatGPT对科技发展的影响谈谈你对ChatGPT的看法ChatGPT对科技发展的负面影响ChatGPT的存在是利是弊&#xff1f;关于全国科技者工作日 讲讲科技发展的那些事儿 谈谈ChatGPT对科技发展的影响 谈谈你对ChatGPT的看法 ChatGPT对科技发…

ChatGPT的诞生和发展

ChatGPT的诞生和发展 ChatGPT是一种基于GPT模型的聊天机器人。GPT模型是一种基于深度学习的自然语言处理模型&#xff0c;由OpenAI团队开发&#xff0c;可以生成与输入文本相关的连续文本。ChatGPT的诞生和发展&#xff0c;可以追溯到GPT模型的开发与应用。 一、GPT模型的开…

大模型底层原理与引用开发范式

大模型基本原理 temperature: 随机性top_prepetition_penalty: 重复性 大模型时代以前 LLM时代的开发范式 Prompt工程 Embedding辅助 大模型微调 必备能力和工具 ChatPaper

【花雕学AI】爆款ChatGPT的核心算法和技术逻辑到底是什么?

一、ChatGPT是一种基于GPT模型的聊天机器人 由OpenAI研究中心开发&#xff0c;于2022年11月30日发布。它可以根据用户的输入&#xff0c;生成自然、流畅、有趣的对话回复。它的技术逻辑主要是利用大规模的预训练语言模型&#xff08;LLM&#xff09;&#xff0c;通过Transforme…

新致新知 | ChatGPT+企业知识图谱

作为史上最快获1亿用户的ChatGPT以及大语言模型展现了令人惊叹的广博知识、语义理解能力与创造能力&#xff0c;在会话中能投人所好地承认自身错误并进行改正&#xff0c;并能进行一定程度的逻辑推理&#xff0c;还有多语种翻译与多语言编程等“超能力”&#xff0c;胜任诸多自…

ChatGPT的背后逻辑

文/孟永辉 ChatGPT&#xff0c;的确是当下最炙手可热的一个话题。然而&#xff0c;人们对于ChatGPT的认识&#xff0c;依然还是仅仅停留在ChatGPT本身&#xff0c;而没有将它与它的「前任」——元宇宙、web3.0&#xff0c;乃至NFT联系在一起。如果在看待ChatGPT的时候&#xf…