阅读视图

发现新文章,点击刷新页面。

每日一题-三角形类型🟢

给你一个下标从 0 开始长度为 3 的整数数组 nums ,需要用它们来构造三角形。

  • 如果一个三角形的所有边长度相等,那么这个三角形称为 equilateral 。
  • 如果一个三角形恰好有两条边长度相等,那么这个三角形称为 isosceles 。
  • 如果一个三角形三条边的长度互不相同,那么这个三角形称为 scalene 。

如果这个数组无法构成一个三角形,请你返回字符串 "none" ,否则返回一个字符串表示这个三角形的类型。

 

示例 1:

输入:nums = [3,3,3]
输出:"equilateral"
解释:由于三条边长度相等,所以可以构成一个等边三角形,返回 "equilateral" 。

示例 2:

输入:nums = [3,4,5]
输出:"scalene"
解释:
nums[0] + nums[1] = 3 + 4 = 7 ,大于 nums[2] = 5 
nums[0] + nums[2] = 3 + 5 = 8 ,大于 nums[1] = 4 。
nums[1] + nums[2] = 4 + 5 = 9 ,大于 nums[0] = 3 。
由于任意两边之和都大于第三边,所以可以构成一个三角形,因为三条边的长度互不相等,所以返回 "scalene"。

提示:

  • nums.length == 3
  • 1 <= nums[i] <= 100

模拟处理

Problem: 3024. 三角形类型 II

[TOC]

思路

直接模拟处理。

Code

执行用时分布38ms击败53.04%;消耗内存分布16.18MB击败99.58%

###Python3

class Solution:
    def triangleType(self, nums: List[int]) -> str:
        if nums[0] == nums[1] == nums[2]: return "equilateral"
        nums.sort()
        if nums[0] + nums[1] <= nums[2]: return "none"
        if len(set(nums)) == 2: return "isosceles"
        return "scalene"

您若还有不同方法,欢迎贴在评论区,一起交流探讨! ^_^

↓ 点个赞,点收藏,留个言,再划走,感谢您支持作者! ^_^

用排序简化代码逻辑(Python/Java/C++/C/Go/JS/Rust)

把 $\textit{nums}$ 从小到大排序,可以简化判断逻辑。

设排序后 $\textit{nums}=[a,b,c]$,那么有 $1\le a\le b\le c$。

  • 先判是否合法,即三角形任意两边之和必须大于第三边。由于排序后 $a+c > b$ 和 $b+c>a$ 自动成立(注意数组元素都是正数),所以只需判断 $a+b > c$ 是否成立。如果 $a+b\le c$,那么无法构成三角形。
  • 然后判等边:只需判断 $a=c$。注意已经排序了,如果 $a=c$,那么必然有 $a=b=c$。
  • 然后判等腰:判断 $a=b$ 或者 $b=c$。
  • 其他情况,三条边长度一定不相等,无需判断。

###py

class Solution:
    def triangleType(self, nums: List[int]) -> str:
        nums.sort()
        a, b, c = nums
        if a + b <= c:
            return "none"
        if a == c:
            return "equilateral"
        if a == b or b == c:
            return "isosceles"
        return "scalene"

###java

class Solution {
    public String triangleType(int[] nums) {
        Arrays.sort(nums);
        int a = nums[0];
        int b = nums[1];
        int c = nums[2];
        if (a + b <= c) {
            return "none";
        }
        if (a == c) {
            return "equilateral";
        }
        if (a == b || b == c) {
            return "isosceles";
        }
        return "scalene";
    }
}

###cpp

class Solution {
public:
    string triangleType(vector<int>& nums) {
        ranges::sort(nums);
        int a = nums[0], b = nums[1], c = nums[2];
        if (a + b <= c) {
            return "none";
        }
        if (a == c) {
            return "equilateral";
        }
        if (a == b || b == c) {
            return "isosceles";
        }
        return "scalene";
    }
};

###c

int cmp(const void* a, const void* b) {
    return *(int*)a - *(int*)b;
}

char* triangleType(int* nums, int numsSize) {
    qsort(nums, numsSize, sizeof(int), cmp);
    int a = nums[0], b = nums[1], c = nums[2];
    if (a + b <= c) {
        return "none";
    }
    if (a == c) {
        return "equilateral";
    }
    if (a == b || b == c) {
        return "isosceles";
    }
    return "scalene";
}

###go

func triangleType(nums []int) string {
slices.Sort(nums)
a, b, c := nums[0], nums[1], nums[2]
if a+b <= c {
return "none"
}
if a == c {
return "equilateral"
}
if a == b || b == c {
return "isosceles"
}
return "scalene"
}

###js

var triangleType = function(nums) {
    nums.sort((a, b) => a - b);
    const [a, b, c] = nums;
    if (a + b <= c) {
        return "none";
    }
    if (a === c) {
        return "equilateral";
    }
    if (a === b || b === c) {
        return "isosceles";
    }
    return "scalene";
};

###rust

impl Solution {
    pub fn triangle_type(mut nums: Vec<i32>) -> String {
        nums.sort_unstable();
        let (a, b, c) = (nums[0], nums[1], nums[2]);
        if a + b <= c {
            return "none".to_string();
        }
        if a == c {
            return "equilateral".to_string();
        }
        if a == b || b == c {
            return "isosceles".to_string();
        }
        "scalene".to_string()
    }
}

复杂度分析

  • 时间复杂度:$\mathcal{O}(1)$。
  • 空间复杂度:$\mathcal{O}(1)$。

附:哈希表做法

在三边长能构成三角形的情况下,用哈希表计算 $\textit{nums}$ 中有 $c$ 个不同元素,然后:

  • $c=1$ 即等边。
  • $c=2$ 即等腰。
  • $c=3$ 即边长互不相同。

###py

class Solution:
    def triangleType(self, nums: List[int]) -> str:
        nums.sort()
        if nums[0] + nums[1] <= nums[2]:
            return "none"
        return ("equilateral", "isosceles", "scalene")[len(set(nums)) - 1]

分类题单

如何科学刷题?

  1. 滑动窗口与双指针(定长/不定长/单序列/双序列/三指针/分组循环)
  2. 二分算法(二分答案/最小化最大值/最大化最小值/第K小)
  3. 单调栈(基础/矩形面积/贡献法/最小字典序)
  4. 网格图(DFS/BFS/综合应用)
  5. 位运算(基础/性质/拆位/试填/恒等式/思维)
  6. 图论算法(DFS/BFS/拓扑排序/基环树/最短路/最小生成树/网络流)
  7. 动态规划(入门/背包/划分/状态机/区间/状压/数位/数据结构优化/树形/博弈/概率期望)
  8. 常用数据结构(前缀和/差分/栈/队列/堆/字典树/并查集/树状数组/线段树)
  9. 数学算法(数论/组合/概率期望/博弈/计算几何/随机算法)
  10. 贪心与思维(基本贪心策略/反悔/区间/字典序/数学/思维/脑筋急转弯/构造)
  11. 链表、二叉树与回溯(前后指针/快慢指针/DFS/BFS/直径/LCA/一般树)
  12. 字符串(KMP/Z函数/Manacher/字符串哈希/AC自动机/后缀数组/子序列自动机)

我的题解精选(已分类)

欢迎关注 B站@灵茶山艾府

小红书一面:长达一个小时的拷打😭

前言 兄弟也是好起来了,又又有大厂面试了。 面试过程: 一、自我介绍 这个自我介绍我之前在面试文章中提到过,大家可以翻翻查看。 二、实习经历 面试官看到我目前在一家公司实习,于是让我聊了聊我的业务内容

从浏览器进程层面理解事件循环

现代浏览器的进程架构 进程之间是独立存在的,因此为了防止浏览器 tab 连续崩坏的情况,如今已经演变成了多进程架构,每个进程都会有个独立的内存空间 一般就是下面这六个进程: 浏览器主进程(Browse

一文解决Babel 插件

Babel 是一个强大的 JavaScript 编译器,它允许开发者在项目中使用最新的 JavaScript 特性,并将其转换为向后兼容的版本,以便在当前和旧版浏览器或环境中运行。Babel 的核心功

前端 SEO 优化

前端 SEO 优化的核心目标: 可抓取性 (Crawlability) : 确保搜索引擎的爬虫能够发现并访问你网站上的所有重要内容。 可索引性 (Indexability) : 确保爬虫能够理解并正确

【开源软件推荐】 so-novel,一个超强的聚合式小说下载工具

📚 前言:网文阅读的困境与解法

你是否曾遇到这样的困扰:想看最新连载小说,要么被迫付费,要么忍受广告横飞的笔趣阁,要么被限制在特定平台的APP中?

虽然市面上已有不少阅读方案,但总有些难以满足的需求:有人嫌弃界面设计太丑,有人吐槽功能不够完善,还有人厌倦了被特定平台限制。在这种情况下,高度可定制化的阅读体验成为了许多书友的终极追求。

今天要介绍的"So Novel"正是为解决这些痛点而生的利器。它能够将全网流行小说(包括连载中和已完本的)一键下载为主流电子书格式,让你可以在任何喜爱的设备上实现真正的离线阅读体验。

🎯 谁适合使用So Novel?

  • 免费(白嫖)看正版网文 ,又追求 极致阅读体验 的资深书友
  • 习惯用手机阅读的iOS用户(由于无法使用"阅读"APP,可通过So Novel下载后导入Apple Books)
  • 喜欢在电脑或大屏设备上阅读的Windows、macOS、Linux用户
  • 钟爱专业电子书阅读器的发烧友
  • 讨厌在线阅读依赖性,习惯将书籍存储在本地的"囤书党"
  • 经常处于无网络环境需要离线阅读的通勤党
  • 追求"开箱即用",不想折腾复杂配置的普通用户

✨ So Novel 介绍

So Novel是一款交互式小说下载器,真正做到了跨平台、无门槛使用:

  • 🖥️ 跨系统支持:windows、maacos、linux皆可使用
  • 📦 开箱即用:下载解压后即可使用,无需任何额外配置
  • 🔍 多源聚合:内置多个书源,支持聚合搜索,无需手动切换
  • 🚀 极速下载:特别优化无限流书源的下载速度
  • 📑 多格式支持:可导出EPUB、TXT、HTML(支持翻页)、PDF等格式
  • 📚 批量下载:同时下载多部作品,效率翻倍
  • 🔄 簡繁转换:内置简繁互转功能,满足不同阅读习惯

如何下载

在 so-novel 官方 Github Releases 下载对应操作系统版本即可:

github.com/freeok/so-n…

注:如果访问不到Github或者下载很慢,这里同时也提供给百度网盘的下载链接:

链接: pan.baidu.com/s/1EfH5_nMT…
提取码: xfdm

我这里是 macos intel芯片,下载 sonovel-macos_x64.tar.gz 就可以,M系列芯片的下载 arm64 版本的

安装使用

下载后将压缩包解压

直接将当前目录拖到 终端 里去(windows 版本的解压后有个 exe 文件,直接双击就可以打开)

然后输入如下命令后,按回车

bash ./run-macos.sh

您可能会遇到这样一个无法验证开发者的警告信息,不用管它,点击取消:

点击 系统设置,找到 隐私与安全性

找到安全性,并改为 APP Store和被认可的开发者

点击仍然允许

再次回到终端,执行上次的命令回车即可打开。

接下来就是按提示输入序号,按回车就行了

需要聚合搜索,输入 q ,按回车,输入书名,按回车:

输入下载序号,按回车:

输入1 下载全本

下载完成后,会自动合并为 epub 格式

合并成功后的 epub 文件位于软件目录下的 downloads 文件夹

导入喜欢的阅读软件,开始享受阅读的乐趣吧!

❌