Rust每日一练(Leetday0017) 字母异位词分组、幂函数、N皇后

news2024/11/26 13:27:52

目录

49. 字母异位词分组 Group Anagrams  🌟🌟

50. 幂函数 Pow(x, n)  🌟🌟

51. N 皇后 N-Queens  🌟🌟🌟

🌟 每日一练刷题专栏 🌟

Rust每日一练 专栏

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏


49. 字母异位词分组 Group Anagrams

给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。

字母异位词 是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。

示例 1:

输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]

示例 2:

输入: strs = [""]
输出: [[""]]

示例 3:

输入: strs = ["a"]
输出: [["a"]]

提示:

  • 1 <= strs.length <= 10^4
  • 0 <= strs[i].length <= 100
  • strs[i] 仅包含小写字母

代码1: 排序+哈希表

use std::collections::HashMap;

fn group_anagrams(strs: Vec<String>) -> Vec<Vec<String>> {
    let mut res = vec![];
    let mut hash: HashMap<String, Vec<String>> = HashMap::new();
    for str in strs {
        let key = sort_string(&str);
        hash.entry(key).or_default().push(str);
    }
    for v in hash.values() {
        res.push(v.clone());
    }
    res
}

fn sort_string(s: &str) -> String {
    let mut s = s.chars().collect::<Vec<char>>();
    s.sort();
    s.into_iter().collect()
}

fn main() {
    let strs = vec![
        "eat".to_string(),
        "tea".to_string(),
        "tan".to_string(),
        "ate".to_string(),
        "nat".to_string(),
        "bat".to_string(),
    ];
    println!("{:?}", group_anagrams(strs));
}

输出:

[["bat"], ["eat", "tea", "ate"], ["tan", "nat"]]

代码2: 计数哈希表

use std::collections::HashMap;

fn group_anagrams(strs: Vec<String>) -> Vec<Vec<String>> {
    let mut res = vec![];
    let mut hash: HashMap<String, Vec<String>> = HashMap::new();
    for str in strs {
        let key = count_string(&str);
        hash.entry(key).or_default().push(str);
    }
    for v in hash.values() {
        res.push(v.clone());
    }
    res
}

fn count_string(s: &str) -> String {
    let mut cnt = [0; 26];
    for c in s.chars() {
        cnt[c as usize - 'a' as usize] += 1;
    }
    let mut res = String::new();
    for i in 0..26 {
        res.push_str(&cnt[i].to_string());
        res.push('#');
    }
    res
}

fn main() {
    let strs = vec![
        "eat".to_string(),
        "tea".to_string(),
        "tan".to_string(),
        "ate".to_string(),
        "nat".to_string(),
        "bat".to_string(),
    ];
    println!("{:?}", group_anagrams(strs));
}

输出:

[["eat", "tea", "ate"], ["tan", "nat"], ["bat"]] 

代码3: 质数哈希表

use std::collections::HashMap;

fn group_anagrams(strs: Vec<String>) -> Vec<Vec<String>> {
    let mut res = vec![];
    let mut hash: HashMap<i32, Vec<String>> = HashMap::new();
    let primes = vec![
        2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103,
    ];
    for str in strs {
        let key = count_prime(&str, &primes);
        hash.entry(key).or_default().push(str);
    }
    for v in hash.values() {
        res.push(v.clone());
    }
    res
}

fn count_prime(s: &str, primes: &[i32]) -> i32 {
    let mut res = 1;
    for c in s.chars() {
        let index = (c as u32 - 'a' as u32) as usize;
        res *= primes[index];
    }
    res
}

fn main() {
    let strs = vec![
        "eat".to_string(),
        "tea".to_string(),
        "tan".to_string(),
        "ate".to_string(),
        "nat".to_string(),
        "bat".to_string(),
    ];
    println!("{:?}", group_anagrams(strs));
}
[["bat"], ["tan", "nat"], ["eat", "tea", "ate"]]

输出:

[["bat"], ["tan", "nat"], ["eat", "tea", "ate"]]


50. 幂函数 Pow(x, n)

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

示例 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

提示:

  • -100.0 < x < 100.0
  • -2^31 <= n <= 2^31-1
  • -10^4 <= x^n <= 10^4

代码1:

fn my_pow(x: f64, n: i32) -> f64 {
    let mut n = n as i64;
    let mut res = 1.0;
    let mut x = x;
    if n < 0 {
        x = 1.0 / x;
        n = -n;
    }
    while n > 0 {
        if n & 1 == 1 {
            res *= x;
        }
        x *= x;
        n >>= 1;
    }
    res
}

fn main() {
    println!("{}", my_pow(2.0, 10));
    println!("{}", my_pow(2.1, 3));
    println!("{}", my_pow(2.0, -2));
}

输出:

1024
9.261000000000001
0.25

代码2:

use std::convert::TryInto;

fn my_pow(x: f64, n: i32) -> f64 {
    if n == 0 {
        return 1.0;
    }
    if x == 1.0 || n == 1 {
        return x;
    }
    let mut n: i64 = n.try_into().unwrap();
    let mut x = x;
    if n < 0 {
        x = 1.0 / x;
        n = -n;
    }
    let mut res = my_pow(x, (n/2).try_into().unwrap()); // 将 i64 转换成 i32
    if n%2 == 0 {
        x = 1.0;
    }
    res *= res * x;
    res
}

fn main() {
    println!("{}", my_pow(2.0, 10));
    println!("{}", my_pow(2.1, 3));
    println!("{}", my_pow(2.0, -2));
}

输出:

1024
9.261000000000001
0.25


51. N 皇后 N-Queens

n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。

每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。

示例 1:

输入:n = 4
输出:[[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]]
解释:如上图所示,4 皇后问题存在两个不同的解法。

示例 2:

输入:n = 1
输出:[["Q"]]

提示:

  • 1 <= n <= 9

代码:

package main

import (
	"fmt"
)

func solveNQueens(n int) [][]string {
	res := [][]string{}
	board := make([][]byte, n)
	for i := range board {
		board[i] = make([]byte, n)
		for j := range board[i] {
			board[i][j] = '.'
		}
	}
	cols, diag1, diag2 := make([]bool, n), make([]bool, 2*n-1), make([]bool, 2*n-1)
	var backtrack func(int)
	backtrack = func(row int) {
		if row == n {
			tmp := make([]string, n)
			for i := range board {
				tmp[i] = string(board[i])
			}
			res = append(res, tmp)
			return
		}
		for col := 0; col < n; col++ {
			id1, id2 := row-col+n-1, row+col
			if cols[col] || diag1[id1] || diag2[id2] {
				continue
			}
			board[row][col] = 'Q'
			cols[col], diag1[id1], diag2[id2] = true, true, true
			backtrack(row + 1)
			cols[col], diag1[id1], diag2[id2] = false, false, false
			board[row][col] = '.'
		}
	}
	backtrack(0)
	return res
}

func main() {
	for i := 4; i > 0; i-- {
		fmt.Println(solveNQueens(i))
	}
}

输出:

[[".Q..", "...Q", "Q...", "..Q."], ["..Q.", "Q...", "...Q", ".Q.."]]
[]
[]
[["Q"]]

代码2:

fn solve_n_queens(n: i32) -> Vec<Vec<String>> {
    let mut res: Vec<Vec<String>> = Vec::new();
    let mut board: Vec<Vec<char>> = vec![vec!['.'; n as usize]; n as usize];

    fn is_valid(board: &[Vec<char>], row: usize, col: usize) -> bool {
        let n = board.len();
        for i in 0..row {
            if board[i][col] == 'Q' {
                return false;
            }
        }
        let mut i = row as i32 - 1;
        let mut j = col as i32 - 1;
        while i >= 0 && j >= 0 {
            if board[i as usize][j as usize] == 'Q' {
                return false;
            }
            i -= 1;
            j -= 1;
        }
        let mut i = row as i32 - 1;
        let mut j = col as i32 + 1;
        while i >= 0 && j < n as i32 {
            if board[i as usize][j as usize] == 'Q' {
                return false;
            }
            i -= 1;
            j += 1;
        }
        true
    }

    fn backtrack(
        row: usize,
        n: i32,
        board: &mut Vec<Vec<char>>,
        res: &mut Vec<Vec<String>>,
    ) {
        if row == n as usize {
            let mut tmp: Vec<String> = Vec::new();
            for i in 0..n {
                tmp.push(board[i as usize].iter().collect());
            }
            res.push(tmp);
            return;
        }
        for col in 0..n {
            if is_valid(&board, row, col as usize) {
                board[row][col as usize] = 'Q';
                backtrack(row + 1, n, board, res);
                board[row][col as usize] = '.';
            }
        }
    }

    backtrack(0, n, &mut board, &mut res);
    res
}

fn main() {
    for i in (1..=4).rev() {
        println!("{:?}", solve_n_queens(i));
    }
}

代码3:

fn solve_n_queens(n: i32) -> Vec<Vec<String>> {
    let mut res: Vec<Vec<String>> = Vec::new();
    let mut board: Vec<Vec<char>> = vec![vec!['.'; n as usize]; n as usize];

    fn backtrack(
        row: usize,
        cols: i32,
        diagonals1: i32,
        diagonals2: i32,
        n: i32,
        board: &mut Vec<Vec<char>>,
        res: &mut Vec<Vec<String>>,
    ) {
        if row == n as usize {
            let mut tmp: Vec<String> = Vec::new();
            for i in 0..n {
                tmp.push(board[i as usize].iter().collect());
            }
            res.push(tmp);
            return;
        }
        let available_positions = ((1 << n) - 1) & !(cols | diagonals1 | diagonals2);
        let mut ap = available_positions;
        while ap != 0 {
            let position = ap & -ap;
            let col = (position - 1).count_ones();
            board[row][col as usize] = 'Q';
            backtrack(row + 1, cols | position, (diagonals1 | position) << 1, (diagonals2 | position) >> 1, n, board, res);
            board[row][col as usize] = '.';
            ap &= ap - 1;
        }
    }

    backtrack(0, 0, 0, 0, n, &mut board, &mut res);
    res
}

fn main() {
    for i in (1..=4).rev() {
        println!("{:?}", solve_n_queens(i));
    }
}

代码4:

fn solve_n_queens(n: i32) -> Vec<Vec<String>> {
    let mut res: Vec<Vec<String>> = Vec::new();
    let mut queens: Vec<String> = vec![vec!['.'; n as usize].iter().collect(); n as usize];
    let mut cols: std::collections::HashSet<i32> = std::collections::HashSet::new();
    let mut diag1: std::collections::HashSet<i32> = std::collections::HashSet::new();
    let mut diag2: std::collections::HashSet<i32> = std::collections::HashSet::new();

    fn backtrack(
        n: i32,
        row: usize,
        queens: &mut Vec<String>,
        cols: &mut std::collections::HashSet<i32>,
        diag1: &mut std::collections::HashSet<i32>,
        diag2: &mut std::collections::HashSet<i32>,
        res: &mut Vec<Vec<String>>,
    ) {
        if row == n as usize {
            res.push(queens.clone());
            return;
        }
        for col in 0..n {
            if cols.contains(&(col as i32)) || diag1.contains(&(row as i32 - col as i32)) || diag2.contains(&(row as i32 + col as i32)) {
                continue;
            }
            queens[row] = queens[row][..col as usize].to_string() + "Q" + &queens[row][(col + 1) as usize..];
            cols.insert(col as i32);
            diag1.insert(row as i32 - col as i32);
            diag2.insert(row as i32 + col as i32);
            backtrack(n, row + 1, queens, cols, diag1, diag2, res);
            queens[row] = queens[row][..col as usize].to_string() + "." + &queens[row][(col + 1) as usize..];
            cols.remove(&(col as i32));
            diag1.remove(&(row as i32 - col as i32));
            diag2.remove(&(row as i32 + col as i32));
        }
    }

    backtrack(n, 0, &mut queens, &mut cols, &mut diag1, &mut diag2, &mut res);
    res
}

fn main() {
    for i in (1..=4).rev() {
        println!("{:?}", solve_n_queens(i));
    }
}

🌟 每日一练刷题专栏 🌟

持续,努力奋斗做强刷题搬运工!

👍 点赞,你的认可是我坚持的动力! 

🌟 收藏,你的青睐是我努力的方向! 

评论,你的意见是我进步的财富!  

 主页:https://hannyang.blog.csdn.net/

Rust每日一练 专栏

(2023.5.16~)更新中...

Golang每日一练 专栏

(2023.3.11~)更新中...

Python每日一练 专栏

(2023.2.18~2023.5.18)暂停更

C/C++每日一练 专栏

(2023.2.18~2023.5.18)暂停更

Java每日一练 专栏

(2023.3.11~2023.5.18)暂停更

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能python:Python代码输出666——让你快速入门Python编程

Python代码输出666——让你快速入门Python编程 引言 Python是一种面向对象、解释型计算机程序设计语言。Python广泛应用于Web开发、科学计算、数据分析及人工智能等领域&#xff0c;具有优雅、明确、简单的特点&#xff0c;而且学习起来十分容易。如果你是一名初学者&#xf…

chatgpt赋能python:Python修改信息的方法和应用

Python修改信息的方法和应用 Python是一种简单易学、高效、功能强大的编程语言&#xff0c;被广泛应用于各种领域。其中&#xff0c;修改信息是Python最常用的功能之一。无论是在数据分析、网络爬虫还是Web开发中&#xff0c;我们都需要通过Python对数据进行修改、更新和删除等…

Jetson nano之ROS入门 - - 机器人建模与仿真

文章目录 前言一、URDF建模1. URDF语法详解a. robotb. linkc. joint 2. URDF机器人建模实操 二、Xacro宏优化1、 Xacro宏语法详解2、 Xacro建模实操 三、Rviz与Gazebo仿真1、Gazebo集成URDF建模语法基础2、Gazebo集成URDF实操 总结 前言 在ROS中&#xff0c;机器人建模和仿真是…

Spring(四)基于xml的自动装配

自动装配&#xff1a;根据指定的策略&#xff0c;在IOC容器中匹配某一个bean,自动为指定的bean中所依赖的类类型或接口类型属性赋值。 首先我们来熟悉三层架构的创建过程&#xff1a; 三层架构为controller层&#xff0c;service层&#xff0c;dao层。 在service层里面创建ser…

ShareX_一款好用的截图工具安装- Window

择心】向大家介绍and安装ShareX ShareX 免费、开源、轻量多区域截图无缝处理截图屏幕录制、文件共享各种实用工具&#xff08;如拾色器&#xff0c;屏幕拾色器&#xff0c;尺子&#xff0c;图像编辑器&#xff0c;图像合并&#xff0c;图像分割器&#xff0c;生成图像缩略图&am…

mysql学+练

从开始到放弃&#xff01; 开始 mysql -uroot -p123456退出命令 exit 或者 quit注释 # show databases; 单行注释 -- show databases; 单行注释 /* 多行注释 show databases; */DDL操作数据库 创建 /* 方式1 直接指定数据库名进行创建 */ CREATE DATABASE db1; /* 方式2 …

TerminalWorks TSPrint/TSScan/TSWebCam Crack

/ 远程桌面打印软件&#xff0c;TerminalWorks TSPrint Server/Client 从远程服务器打印到本地打印机的 简单方法 TSPrint 为您提供了一个简单的远程桌面打印软件&#xff0c;以及使 Windows 终端服务操作更容易的附加工具。有选择地启用或禁用功能&#xff0c;以便您可以完全…

Unity刚体

1、Dynamic&#xff1a;动态类型 受重力和力的影响移动和旋转 Material&#xff1a; 物理材质&#xff0c;在刚体上设置了物理材质&#xff0c;如果子物体有碰撞器但是没有设置材质则会通用刚体的物理材质 如果不设置&#xff0c;将使用在Physics 2D窗口中设置的默认材质(Physi…

python day1 函数

文章目录 前言一、python函数二、定义函数三、函数返回值四、实例五、变量作用域六、参数扩展1、默认值参数2、顺序参数&#xff0c;关键词参数3、可变参数4、可变关键词参数5、解包操作 七、函数类型的参数八、高阶函数九、匿名函数十、递归 前言 看深度学习的代码时&#xff…

SO21434 持续进行的网络安全(五)

目录 一、概要 二、目标 三、网络安全监控 3.1 输入 3.1.1 先决条件 3.1.2 进一步支持信息 3.2 要求和建议 3.3 输出 四、网络安全事件评估 4.1 输入 4.1.1 先决条件 4.1.2 进一步支持信息 4.2 要求和建议 4.3 输出 五、漏洞分析 5.1 输入 5.1.1 先决条件 5.…

Sentinel如何使用滑动窗口进行限流和降级,请看这篇文章分享

前言&#xff1a;大家好&#xff0c;我是小威&#xff0c;24届毕业生&#xff0c;在一家满意的公司实习。本篇文章将详细介绍如何Sentinel如何使用滑动窗口进行限流和降级&#xff0c;后续文章将详细介绍其他知识。 如果文章有什么需要改进的地方还请大佬不吝赐教&#x1f44f;…

环境感知算法——3.PSMNet基于Kitti数据集训练

1. 前言 PSMNet的核心思想是通过金字塔结构来捕捉不同尺度的特征信息&#xff0c;从而提高视差估计的精度。其亮点在于&#xff1a;&#xff08;1&#xff09;使用了金字塔形的卷积神经&#xff08;SPP module&#xff09;网络来提取不同尺度的特征信息&#xff1b;&#xff0…

【UR机械臂ros通讯前的示教器网络配置】

1. 前言 欢迎大家阅读2345VOR的博客【D435i深度相机YOLO V5结合实现目标检测】&#x1f973;&#x1f973;&#x1f973;2345VOR鹏鹏主页&#xff1a; 已获得CSDN《嵌入式领域优质创作者》称号&#x1f47b;&#x1f47b;&#x1f47b;&#xff0c;座右铭&#xff1a;脚踏实地&…

《新程序员005:开源深度指南新金融背后的科技力量》

各位CSDN的uu们你们好呀&#xff0c;今天&#xff0c;小雅兰来写书评啦&#xff0c;尽管再忙&#xff0c;也不能不读书&#xff0c;下面&#xff0c;就让小雅兰来带你们走进《新程序员005&#xff1a;开源深度指南&新金融背后的科技力量》这本书的世界吧&#xff01;&#…

安科瑞医用隔离电源系统在浙江某医院项目中的应用

【摘要】介绍该三级乙等综合医院采用安科瑞医用隔离电源系统&#xff0c;使用分体配电柜安装方式&#xff0c;从而实现将TN系统转化为IT系统&#xff0c;以及系统绝缘情况监测。 【关键词】医用隔离电源系统&#xff1b;IT系统&#xff1b;绝缘情况监测&#xff1b;三级乙等综合…

华为OD机试真题 Java 实现【最差产品奖】【2023Q1 200分】

一、题目描述 A公司准备对他下面的N个产品评选最差奖,评选的方式是首先对每个产品进行评分,然后根据评分区间计算相邻几个产品中最差的产品。评选的标准是依次找到从当前产品开始前M个产品中最差的产品,请给出最差产品的评分序列。 二、输入描述 第一行,数字M,表示评分…

chatgpt赋能python:用Python编写软件能够带来哪些SEO优势?

用 Python 编写软件能够带来哪些 SEO 优势&#xff1f; Python 是一种高级编程语言&#xff0c;它的简洁性和易学性让 Python 成为现今最受欢迎的编程语言之一&#xff0c;适用于各种类型的编程任务&#xff0c;并且可以轻松地生成各种种类的软件。在构建网站和应用程序时&…

黑马Redis视频教程实战篇(四)

目录 一、秒杀优化 1.1、秒杀优化-异步秒杀思路 1.2、秒杀优化-Redis完成秒杀资格判断 1.3、秒杀优化-基于阻塞队列实现秒杀优化 二、Redis消息队列 2.1、认识消息队列 2.2、基于List实现消息队列 2.3、基于PubSub的消息队列 2.4、基于Stream的消息队列 2.5、基于Str…

【C++初阶】C++STL详解(一)—— string类

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;C初阶 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录 CSTL详解&#xff08;一…

6.3 SpringBoot日志进阶实战 Logback配置详解

文章目录 前言一、Logback入门级配置二、动态指定属性三、动态指定日志级别四、指定配置文件五、滚动记录RollingFIleAppender六、异步记录AsyncAppender总结最后 前言 在上一篇文章中&#xff0c;我和你介绍了SpringBoot快速入门Slf4j Logback实战&#xff0c;遗留的问题是如…