【刷题笔记】第五天

学习嵌入式第五天 执行者:ROOT用户说明:查看所有磁盘列表,包括Linux自身 + 外部存储设备(查询所有可挂载的文件系统,对应的文件系统会在/dev下产生一个对应的设备文件)语法:演示:注意:以上的/dev/sda1就是我们后续挂载需要的设备名,每一个名字对应一个存储空间。在Linux中,对应硬件的操作,说白了,就是对其设备文件的读写。 阅读详情

705. 设计哈希集合

实现一:纯数组实现

由于key最大为 1 0 6 10^6 106,所以开辟一个 1 0 6 + 1 10^6+1 106+1长度的布尔数组,来判断key是否存在。

class MyHashSet {
    private static int MAX = (int)1e6 + 1;
    public boolean[] flag;
    public MyHashSet() {
        flag = new boolean[MAX];
    }
    
    public void add(int key) {
        flag[key] = true;
    }
    
    public void remove(int key) {
        flag[key] = false;
    }
    
    public boolean contains(int key) {
        return flag[key];
    }
}

实现二:数组+链表

java中的HshSet的实现原理:

使用HashMap当作数组,其中元素存放在key中。

当添加元素key时,首先计算key在数组中的位置,计算过程如下:

int hash = (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
return hash & (数组长度 - 1)

如果key是空,直接返回0
否则,key的哈希值与右移后的哈希值做异或,结果就是key的新哈希值
然后将新哈希值与长度-1做与,结果就是key在数组中的位置。

添加元素key的流程:
首先计算出key对应的索引index;
如果index位置没有元素,直接放入;否则判断链表里有没有重复元素,若有,则直接返回;
否则将key插入到链表里。

我们仿照这个来实现

class MyHashSet {
    static class Node {
        int val;
        Node next;
        public Node(int val) {
            this.val = val;
        }
    }
    // 为了便于计算索引的位置,将数组长度定为2的整数次方 (int)Math.pow(2, 14);
    // 这个数组的长度可以很小
	private static final int N = (int)Math.pow(2, 14);
    Node[] table = new Node[N];

    public MyHashSet() {
        //table = new Node[N];
    }

    // 获取key在哈希表中的索引
    private int getIndex(Integer key) {
        // 为了让 key 对应的 hash 高位也参与运算,这里对 hashCode 进行无符号右移异或
    	// 如果hash小于等于2^16 - 1(65535),则无符号右移后变为0
        // 通过将高16位与低16位异或,从而使得 hashCode 的高位随机性和低位随机性都能体现在低 16 位中
        int hashCode = Integer.hashCode(key);
        hashCode ^= (hashCode >>> 16);
        return (N - 1) & hashCode;
    }
    
    public void add(int key) {
        int index = getIndex(key);
        if (table[index] == null) {
            // index位置没元素,直接放
            table[index] = new Node(key);
        } else {
            // index位置有元素了,把key插入到table[index]链表里
            // 在插入之前,先判断链表里是否存在key
            Node pre = null;
            Node cur = table[index];
            while (cur != null) {
                if (cur.val == key) {
                    // key重复了,添加失败
                    return;
                }
                pre = cur;
                cur = cur.next;
            }
            // 此时pre是链表的尾节点
            // 两种插入方式(头插法,尾插法),这里使用尾插法
            Node node = new Node(key);
            pre.next = node;
        }

    }
    
    public void remove(int key) {
        int index = getIndex(key);
        Node cur = table[index];
        if (cur != null) {
            Node pre = null;
            while (cur != null) {
                if (cur.val == key) {
                    if (pre == null) {
                        // 删除链表的头节点
                        table[index] = cur.next;
                    } else {
                        // 删除链表的中间节点
                        pre.next = cur.next;
                    }
                    return;
                }
                pre = cur;
                cur = cur.next;   
            }
        }
    }
    
    public boolean contains(int key) {
        int index = getIndex(key);
        Node cur = table[index];
        while (cur != null) {
            if (cur.val == key) {
                return true;
            }
            cur = cur.next;
        }
        return false;
    }
}

实现三:位运算

int类型有32位,可以表示32个数,那么31250个int,可以表示1000000个数(0~999999),所以数组长度定为31251

每一个int代表一个块,一共312501个块,每一块里能代表32个数

那如何找到key对应的块呢?
通过key / 32操作

如何找到key在块中的索引呢?
通过key % 32,更高效的做法是key & 31(31的二进制是5个1)

初始时,数组元素置为0,表示一个元素也没有

添加元素:将对应块的位置为1

移除元素:将对应块的位置为0

class MyHashSet {

    // int类型有32位,可以表示32个数,那么31250个int,可以表示1000000个数(0~999999)
    // 所以数组长度定为31251
    public int[] table = new int[31251];

    public MyHashSet() {

    }
    
    public void add(int key) {
        int index = key >> 5; // 相当于除以32
        int bitIndex = key & 31; // 相当于key % 32
        table[index] |= (1 << bitIndex); // 将table[index]的bitIndex位置1
    }
    
    public void remove(int key) {
        int index = key >> 5; // 相当于除以32 (块索引)
        int bitIndex = key & 31; // 相当于key % 32 (位索引)
        table[index] &= (~(1 << bitIndex)); // 将table[index]的bitIndex位置0
    }
    
    public boolean contains(int key) {
        int index = key >> 5; // 相当于除以32
        int bitIndex = key & 31; // 相当于key % 32
        return ((table[index] >> bitIndex) & 1) == 1;
    }
}

A + B Problem II

手动实现大整数加

import java.util.Scanner;

public class Main{
	public static String add(String a, String b) {
		String res = "";
		int i = a.length() - 1;
		int j = b.length() - 1;
		int c = 0; // 进位
		while (i >= 0 || j >= 0 || c > 0) {
            // 从低位到高位,一位一位的算
			char aChar = i >=0 ? a.charAt(i) : '0';
			char bChar = j >= 0 ? b.charAt(j) : '0';
			int ans = 0;
			ans += c;
			ans += aChar - '0' + bChar - '0';
			c = ans / 10;
			res = String.valueOf(ans % 10) + res;
			i--;
			j--;
		}	
		return res;
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		int t = sc.nextInt();
		for (int i = 0; i < t; ++i) {
			String a = sc.next();
			String b = sc.next();
			String ans = add(a, b);
			System.out.println("Case " + String.valueOf(i + 1) + ":");
			System.out.println(a + " + " + b + " = " + ans);
			System.out.println();
		}
	}
}

DNA sequence

迭代加深搜索

目标字符串的长度是未知的,所以应该从所有序列的最大长度开始搜索

通过剪枝限制递归的深度

剪枝策略:如果已经匹配的字符个数+最长待匹配字符数 > 目标字符串的长度,则直接返回false,表示之前的匹配方案无效。

对于最长待匹配字符数,有两种计算方法:

方法一:统计所有序列中最长的待匹配字符数

int ans = 0;
for(int i = 1; i <= n; ++i) {
    ans = max(len[i] - pos[i] + 1, ans); //最大待匹配长度 
return ans;

方法二:统计所有序列的待匹配部分中A出现的最多次数+C出现的最多次数+G出现的最多次数+T出现的最多次数,并返回

int ans = 0;
// 计算A,C,G,T最多出现次数的累加和
for (int i = 1; i <= 4; ++i) {
	int maxCnt = 0;
	// 计算dic[i]最多出现次数
	for (int j = 1; j <= n; ++j) {
		// 计算s[j]中 dic[i] 出现的次数
		int t = 0;
		for (int k = pos[j]; k <= len[j]; ++k) {
			t += s[j][k] == dic[i] ? 1 : 0;
		}
		maxCnt = max(maxCnt, t);
	}
	ans += maxCnt;
}

return ans;

显然方法二剪枝策略更高效

#include<iostream>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
const int MAX_N = 10, MAX_L = 10;

char s[MAX_N][MAX_L]; // s[i]:表示第i个序列
int pos[MAX_N]; // pos[i]: 表示第i个序列的第一个待匹配位置
int len[MAX_N]; // len[i]:表示第i个序列的长度
int n, t, res;

char dic[5] = { 0, 'A', 'C', 'G', 'T' };

int wrong() {
	int ans = 0;
	// 计算A,C,G,T最多出现次数的累加和
	for (int i = 1; i <= 4; ++i) {
		int maxCnt = 0;
		// 计算dic[i]最多出现次数
		for (int j = 1; j <= n; ++j) {
			// 计算s[j]中 dic[i] 出现的次数
			int t = 0;
			for (int k = pos[j]; k <= len[j]; ++k) {
				t += s[j][k] == dic[i] ? 1 : 0;
			}
			maxCnt = max(maxCnt, t);
		}
		ans += maxCnt;
	}

	return ans;
}

// dep表示已经匹配的字符数
bool dfs(int dep) {
	
	int temp = wrong();
	if (temp == 0) {
		// 待匹配字符数为0
		return true;
	}

	if (dep + temp > res) {
		// dep + temp 大于序列长度,说明之前的匹配方案无效
		return false;
	}
	vector<int> v;
	for (int i = 1; i <= 4; ++i) {
		for (int j = 1; j <= n; ++j) {
			if (s[j][pos[j]] == dic[i]) {
				// s[j]序列成功匹配到一个字符
				pos[j]++;
				v.push_back(j); // 记录一下,再结束递归时,再恢复现场
			}
		}

		if (v.size() > 0) {
			// 有序列成功匹配到,才进行递归
			// 继续匹配
			if (dfs(dep + 1)) {
				return true;
			}
			else {
				// 恢复现场
				while (v.size() > 0) {
					int tail = v[v.size() - 1];
					v.pop_back();
					pos[tail]--;
				}
			}
		}
	}
	return false;
}

int main() {
	scanf("%d", &t);
	while (t--) {
		scanf("%d", &n);
		res = 0;
		for (int i = 1; i <= n; ++i) {
			memset(s[i], '\0', sizeof(s[i]));
			scanf("%s", s[i] + 1);
			pos[i] = 1;
			len[i] = strlen(s[i] + 1);
			//printf("s[i]=%s, len[i]=%d\n", s[i], len[i]);
			res = max(res, len[i]);
		}
		while (!dfs(0)) {
			res++;
		}
		printf("%d\n", res);
	}
	return 0;
}
Polyworks脚本开发学习笔记(一)-脚本开发环境 详细的总结和记录了利用Polyworks进行脚本开发的一些方法和心得 阅读详情

相关推荐

四旋翼滑模控制:从理论到Simulink实现

本文深入探讨了四旋翼滑模控制的理论与Simulink实现,对比了其相较于PID控制在抗干扰和鲁棒性方面的显著优势。文章详细介绍了从精确动力学建模、内外环滑模控制器设计到指令解算的完整流程,并分享了Simulink仿真搭建、参数调试及抗扰性能验证的实战经验,帮助工程师掌握在复杂环境下提升四旋翼稳定性的进阶技能。

weixin_29163581的博客 375

刷题笔记(第五天)

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。每一次要将存储最长子串的变量s1置空的时候,将该子串的长度存入数组a中、同时要注意将i退回(i-s1.length+1),最后找出数组a中最大元素,即最长子串的长度。通常情况下,罗马数字中小的数字在大的数字的右边。解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1]。罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。

m0_62508027的博客 255

Windows11安装UE4+Airsim

Windows11安装UE4+Airsim

Legendyyy的博客 3743

算法刷题第五天(跑路人笔记)<双指针>

文章目录第五天链表的中间节点删除链表的倒数第N个节点思路一(自己写法)思路二(双指针) 第五天 链表的中间节点 876. 链表的中间结点 - 力扣(LeetCode) 使用快慢指针,fast指针一次走两个节点slow一次走一个节点.当fast或fast->next 走到NULL时我们的slow也就到了中间节点位置 /** * Definition for singly-linked list. * struct ListNode { * int val; * struct L

qq_61434711的博客 243

ArcGIS 10.8软件安装包免费下载及安装教程

ArcGIS 10.8安装教程

qq_44894692的博客 2万+

大疆无人机地理视频制作全流程:从SRT文件到GIS叠加(附实战避坑指南)

本文详细解析了大疆无人机地理视频制作全流程,从解析SRT文件中的位姿数据,到在GIS软件中构建地理视频工程并生成可分发的文件。文章重点介绍了地理视频的核心概念、数据处理实战技巧,并探讨了其在应急响应、工程巡检等场景的高级应用与精度边界,为GIS工程师和无人机爱好者提供了一份实用的避坑指南。

river的博客 463

【第五天】LeetCode刷题笔记分享 | 容易篇 | 1431拥有最多糖果的孩子

文章目录一、题目信息1.1 题目的描述1.2 示例1.3 提示二、题解2.1 自己的代码实现2.2 参考题解三、题目总结 一、题目信息 1.1 题目的描述 给你一个数组 candies 和一个整数 extraCandies ,其中candies[i]代表第 i 个孩子拥有的糖果数目。 对每一个孩子,检查是否存在一种方案,将额外的extraCandies 个糖果分配给孩子们之后,此孩子有最多的糖果。注意,允许有多个孩子同时拥有最多的糖果数目。 1.2 示例 示例1 输入:candies = [2,3,5

weixin_45615071的博客 363

基于Web的智能家居(源码+开题)

实践上,智能家居系统的普及和应用将极大改善人们的居住体验,提高生活质量,同时也有助于促进智能家居产业链的发展和完善,为社会经济发展注入新的活力。此外,本研究还将对基于Web的智能家居系统的用户体验进行深入研究,通过用户调研和数据分析,不断优化系统功能和界面设计,提升用户的使用体验和满意度。针对以上问题,本研究将综合运用物联网、云计算、大数据等新一代信息技术,通过系统架构设计、功能模块开发、安全性保障、用户体验优化等多个方面的研究工作,力求为基于Web的智能家居系统的研发和应用提供全面而有效的解决方案。

sryue06的博客 1902

LeetCode热题100 刷题笔记(第五天)多维动态规划(中心扩展法) 「 最长回文子串」

本文介绍了寻找字符串中最长回文子串的算法。核心思路是利用回文串的中心对称特性,遍历每个字符作为中心点向两边扩展。对于奇数长度回文以单个字符为中心,偶数长度则以相邻字符间隙为中心。通过辅助方法expandAroundCenter计算每个中心能扩展的最大回文长度,并记录最长子串的起止位置。算法时间复杂度为O(n²),适用于长度不超过1000的字符串。最后以Java代码实现该算法,包含边界处理和中心扩展的具体实现。

2301_81189772的博客 88

ROS2 -Jazzy 一步一步(第一步_工作空间以及编译)

文件夹作用特点是否需要手动创建/维护src存放自己写的 ROS 2 包一个 workspace 可以有多个包需要手动创建build保存编译过程中的中间文件每个包生成对应子目录自动生成,可删除install保存编译完成后的功能包每个包有独立子目录,含可执行文件自动生成,可删除log保存编译日志用于查看错误原因、调试自动生成,不需修改colcon是 ROS 2 推荐使用的构建工具自动处理功能包的依赖和编译顺序一条命令就能编译整个工作空间。

jerrykorea的博客 1380

Verilog语法之十:过程块(initial和always)

我将Verilog的语法进行了总结,写了13篇文章,让小白“快速见识猪如何跑”,每一篇讲解一类语法,结合正确的示例代码和错误的示例代码,有的章节对个别语法进行了归纳总结,帮助初学者加深理解。

航天领域资深码农,型号经验丰富,一线干货分享 1671

【跟着英雄学算法第⑤天】计数法——附Leetcode刷题题解(C语言实现)

✨前言✨ 在这个系列中,博主准备分享每日在万人千题社区打卡学习的算法。博主也是小白,因此也很能理解新手在刷题时的困惑,所以关注博主,每天学习一道算法吧。同时也欢迎大家加入万人千题习活动,正所谓:一个人可以走的很快,但一群人才能走的更远。 万人千题打卡社区https://bbs.youkuaiyun.com/forums/hero?category=0&typeId=17913 一、算法思想笔记 我们知道,通过for循环,可以用一个计数变量计数出某个数出现多少次。那么如何反应一组数的数据分布...

罅隙的博客 4728

新政下的绿电直连项目经济性分析:模式创新与价值重构

随着全球气候治理与低碳转型进程不断加速,绿电直连作为新能源就近消纳的创新模式,正成为破解新能源消纳瓶颈、规避碳关税壁垒的核心路径。2025年9月,国家发展改革委、国家能源局发布《关于完善价格机制促进新能源发电就近消纳的通知》(1192号文),为绿电直连项目的经济性分析与效益测算提供了明确的政策依据。本文将基于新政框架,深入解析绿电直连项目的经济性影响因素、盈利模式与优化路径,并结合案例与量化模型,为项目投资决策提供系统参考。

getusushu的博客 137

JavaScript第五天的笔记整理

JavaScript第五天的笔记整理 数组

qq_41943654的博客 124

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

python 学习第五天

对自己学习的python做的笔记(思维导图),这是第四天的学习,之后的学习笔记还会上传,方便志同道合的朋友下载参考,并希望大家提出宝贵的建议! 利用xmind导出的图片形式: ...

Fighting 160

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

顺序结构-P5703 苹果采购-第五天

记录自己的刷题笔记

在csdn分享更多技术知识,相互交流 121

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

随缘刷题算法学习笔记

文章目录前言一、第一天总结 前言 每日一题算法,快乐源泉,当记录用~~ 一、第一天 题目:剑指 Offer 03. 数组中重复的数字 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof 解..

weixin_44181180的博客 550

30天自制操作系统第五天学习笔记(u盘启动)

暑假学习小日本的那本书:30天自制操作系统 qq交流群:122358078    ,更多学习中的问题、资料,群里分享 environment:开发环境:ubuntu 第五天的学习笔记: 第五天的课程差点就没有进行下去,因为之前作者用写headasm.nas是用的nasm汇编器,但是写c语言用的gcc,两都不好结合,需要用很多工具,比较麻烦。所以我借用了mit的操作系统课程中的一点代

761

第五天笔记(object,Date,calendar,Collection集合)

a1727741982的博客 531

第五天每日Leetcode刷题——135.分发糖果

昨天其实是做了题目的 但是太简单就没写了 今天换了个刷题顺序 ,跟着GitHub上的高畅大佬刷题顺序 然后开始先刷贪心 再来回归到这题 n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。 你需要按照以下要求,给这些孩子分发糖果: 每个孩子至少分配到 1 个糖果。 相邻两个孩子评分更高的孩子会获得更多的糖果。 请你给每个孩子分发糖果,计算并返回需要准备的 最少糖果数目 这题主要考察贪心,这里的贪心策略即为,在每次遍历中,只考虑并更新相邻一 侧的大小关系。 我们只需要.

qq_58281383的博客 255

【智慧商城 | 项目笔记】第五天

前言:智慧商城项目是关于前端的Vue2的项目,本系列文章,我讲总结我从这个项目中学到的知识点,写项目笔记。如果你也在初学Vue或想巩固Vue相关的知识,希望这系列文章可以帮助到你。

A923A的博客 270

实训笔记第五天

sql续 IN 操作符   IN 操作符允许我们在 WHERE 子句中规定多个值。 SQL IN 语法: SELECT column_name(s) FROM table_name WHERE column_name IN (value1,value2,...) 查询empno为7900,7901,7902的三条信息: S

qq_32781063的博客 519

【5】android底层驱动开发学习

下面为第五天学习整理的笔记:   (一)android底层驱动开发第五天(密码: n6xs )

自由自在的飞翔的专栏 1286

MySQL学习笔记(第五天)

SELECT * FROM product WHERE cid IN (SELECT cid FROM category WHERE cname IN ('家电','鞋服'));查询`家电类`和`鞋服类`下面的全部商品信息。SELECT 字段 FROM 表 WHERE id = (SELECT 字段 FROM 表 WHERE 条件)SELECT 字段 FROM (SELECT 字段 FROM 表 WHERE)AS 别名 WHERE 条件;被嵌入的SELECT => 子查询 => (查询数据源| 查询条件)

2303_78135757的博客 764

《Linux就该这么学》上课第五天的笔记

今天是开课第五天,略有难度,需要理解的东西也多了起来。 有的地方没有听懂,需要回看视频了。 1. 2. 3. 4.

qq_40383366的博客 133

第五天

第五天 第五天由二十五-三十四组成 自己写的代码:http://pan.baidu.com/s/1bpEV4xL 教程:http://pan.baidu.com/s/1sl8xuLB posted on 2017-10-19 08:40 Michael2397 阅读(...) 评论(.....

哎呀妈呀脑壳疼脑壳疼 99
上一篇: 【刷题笔记】第四天
下一篇: 【刷题笔记】第六天
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值