当前位置: 首页 > 编程日记 > 正文

技术图文:字典技术在求解算法题中的应用

背景

前段时间,在知识星球立了一个Flag,这是总结Leetcode刷题的第二篇图文。

在总结这篇图文的时候,顺便总结了 C# 中Dictionary类的实现,大家可以参考一下:

  • 浅析 C# Dictionary实现原理

理论部分

C# 中字典的常用方法

对于 C# 中的 Dictionary类 相信大家都不陌生,这是一个 Collection(集合) 类型,可以通过 Key/Value (键值对) 的形式来存放数据;该类最大的优点就是它查找元素的时间复杂度接近 O(1),实际项目中常被用来做一些数据的本地缓存,提升整体效率。

常用方法如下:

  • public Dictionary(); -> 构造函数
  • public Dictionary(int capacity); -> 构造函数
  • public void Add(TKey key, TValue value); -> 将指定的键和值添加到字典中。
  • public bool Remove(TKey key); -> 将带有指定键的值移除。
  • public void Clear(); -> 将所有键和值从字典中移除。
  • public bool ContainsKey(TKey key); -> 确定是否包含指定键。
  • public bool ContainsValue(TValue value); -> 确定否包含特定值。
  • public TValue this[TKey key] { get; set; } -> 获取或设置与指定的键关联的值。
  • public KeyCollection Keys { get; } -> 获得键的集合。
  • public ValueCollection Values { get; } -> 获得值的集合。
public static void DicSample()
{Dictionary<string, string> dic = new Dictionary<string, string>();try{if (dic.ContainsKey("Item1") == false){dic.Add("Item1", "ZheJiang");}if (dic.ContainsKey("Item2") == false){dic.Add("Item2", "ShangHai");}else{dic["Item2"] = "ShangHai";}if (dic.ContainsKey("Item3") == false){dic.Add("Item3", "BeiJing");}}catch (Exception e){Console.WriteLine("Error: {0}", e.Message);}if (dic.ContainsKey("Item1")){Console.WriteLine("Output: " + dic["Item1"]);}foreach (string key in dic.Keys){Console.WriteLine("Output Key: {0}", key);}foreach (string value in dic.Values){Console.WriteLine("Output Value: {0}", value);}foreach (KeyValuePair<string, string> item in dic){Console.WriteLine("Output Key : {0}, Value : {1} ", item.Key, item.Value);}
}// Output: ZheJiang
// Output Key: Item1
// Output Key: Item2
// Output Key: Item3
// Output Value: ZheJiang
// Output Value: ShangHai
// Output Value: BeiJing
// Output Key: Item1, Value: ZheJiang
// Output Key: Item2, Value: ShangHai
// Output Key: Item3, Value: BeiJing

注意:增加键值对之前需要判断是否存在该键,如果已经存在该键而不判断,将抛出异常。

Python 中字典的常用方法

Python中的 字典 是无序的 键:值(key:value)对集合,在同一个字典之内键必须是互不相同的。

  • dict 内部存放的顺序和 key 放入的顺序是没有关系的。
  • dict 查找和插入的速度极快,不会随着 key 的增加而增加,但是需要占用大量的内存。

字典 定义语法为 {元素1, 元素2, ..., 元素n}

  • 其中每一个元素是一个「键值对」-- 键:值 (key:value)
  • 关键点是「大括号 {}」,「逗号 ,」和「冒号 :」
  • 大括号 – 把所有元素绑在一起
  • 逗号 – 将每个键值对分开
  • 冒号 – 将键和值分开

常用方法如下:

  • dict() -> 构造函数。
  • dict(mapping) -> 构造函数。
  • dict(**kwargs) -> 构造函数。
  • dict.keys() -> 返回一个可迭代对象,可以使用 list() 来转换为列表,列表为字典中的所有键。
  • dict.values() -> 返回一个迭代器,可以使用 list() 来转换为列表,列表为字典中的所有值。
  • dict.items() -> 以列表返回可遍历的 (键, 值) 元组数组。
  • dict.get(key, default=None) -> 返回指定键的值,如果值不在字典中返回默认值。
  • dict.setdefault(key, default=None) -> 和get()方法 类似, 如果键不存在于字典中,将会添加键并将值设为默认值。
  • key in dict -> in 操作符用于判断键是否存在于字典中,如果键在字典 dict 里返回true,否则返回false
  • key not in dict -> not in操作符刚好相反,如果键在字典 dict 里返回false,否则返回true
  • dict.pop(key[,default]) -> 删除字典给定键 key 所对应的值,返回值为被删除的值。key 值必须给出。若key不存在,则返回 default 值。
  • del dict[key] -> 删除字典给定键 key 所对应的值。
def DicSample(self):dic = dict()try:if "Item1" not in dic:dic["Item1"] = "ZheJiang"if "Item2" not in dic:dic.setdefault("Item2", "ShangHai")else:dic["Item2"] = "ShangHai"dic["Item3"] = "BeiJing"except KeyError as error:print("Error:{0}".format(str(error)))if "Item1" in dic:print("Output: {0}".format(dic["Item1"]))for key in dic.keys():print("Output Key: {0}".format(key))for value in dic.values():print("Output Value: {0}".format(value))for key, value in dic.items():print("Output Key: {0}, Value: {1}".format(key, value))# Output: ZheJiang
# Output Key: Item1
# Output Key: Item2
# Output Key: Item3
# Output Value: ZheJiang
# Output Value: ShangHai
# Output Value: BeiJing
# Output Key: Item1, Value: ZheJiang
# Output Key: Item2, Value: ShangHai
# Output Key: Item3, Value: BeiJing

应用部分

题目1:两数之和

  • 题号:1
  • 难度:简单
  • https://leetcode-cn.com/problems/two-sum/

给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个整数,并返回他们的数组下标。

你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。

示例1:

给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9,所以返回 [0, 1]

示例2:

给定 nums = [230, 863, 916, 585, 981, 404, 316, 785, 88, 12, 70, 435, 384, 778, 887, 755, 740, 337, 86, 92, 325, 422, 815, 650, 920, 125, 277, 336, 221, 847, 168, 23, 677, 61, 400, 136, 874, 363, 394, 199, 863, 997, 794, 587, 124, 321, 212, 957, 764, 173, 314, 422, 927, 783, 930, 282, 306, 506, 44, 926, 691, 568, 68, 730, 933, 737, 531, 180, 414, 751, 28, 546, 60, 371, 493, 370, 527, 387, 43, 541, 13, 457, 328, 227, 652, 365, 430, 803, 59, 858, 538, 427, 583, 368, 375, 173, 809, 896, 370, 789], target = 542因为 nums[28] + nums[45] = 221 + 321 = 542,所以返回 [28, 45]

思路:利用字典的方式

把字典当作一个存储容器,key 存储已经出现的数字,value 存储数组的下标。

C# 语言

  • 执行结果:通过
  • 执行用时:280 ms, 在所有 C# 提交中击败了 96.53% 的用户
  • 内存消耗:31.1 MB, 在所有 C# 提交中击败了 6.89% 的用户
public class Solution 
{public int[] TwoSum(int[] nums, int target) {int[] result = new int[2];Dictionary<int, int> dic = new Dictionary<int, int>();for (int i = 0; i < nums.Length; i++){int find = target - nums[i];if (dic.ContainsKey(find)){result[0] = dic[find];result[1] = i;break;}if (dic.ContainsKey(nums[i]) == false)dic.Add(nums[i], i);}return result;    }
}  

Python 语言

  • 执行结果:通过
  • 执行用时:52 ms, 在所有 Python3 提交中击败了 86.77% 的用户
  • 内存消耗:15.1 MB, 在所有 Python3 提交中击败了 7.35% 的用户
class Solution:def twoSum(self, nums: List[int], target: int) -> List[int]:result = list()dic = dict()for index, val in enumerate(nums):find = target - valif find in dic is not None:result = [dic[find], index]breakelse:dic[val] = indexreturn result

题目2:只出现一次的数字 II

  • 题号:137
  • 难度:中等
  • https://leetcode-cn.com/problems/single-number-ii/

给定一个 非空 整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。

说明:

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

示例 1:

输入: [2,2,3,2]
输出: 3

示例 2:

输入: [0,1,0,1,0,1,99]
输出: 99

思路:利用字典的方式

把字典当作一个存储容器,key 存储数组中的数字,value 存储该数字出现的频数。

C# 语言

  • 执行结果:通过
  • 执行用时:112 ms, 在所有 C# 提交中击败了 91.53% 的用户
  • 内存消耗:25.4 MB, 在所有 C# 提交中击败了 100.00% 的用户
public class Solution
{public int SingleNumber(int[] nums){Dictionary<int, int> dict = new Dictionary<int, int>();for (int i = 0; i < nums.Length; i++){if (dict.ContainsKey(nums[i])){dict[nums[i]]++;}else{dict.Add(nums[i], 1);}}return dict.Single(a => a.Value == 1).Key;}
}

Python 语言

  • 执行结果:通过
  • 执行用时:40 ms, 在所有 Python3 提交中击败了 89.20% 的用户
  • 内存消耗:15.1 MB, 在所有 Python3 提交中击败了 25.00% 的用户
class Solution:def singleNumber(self, nums: List[int]) -> int:dic = dict()for num in nums:if num in dic:dic[num] += 1else:dic[num] = 1for k, v in dic.items():if v == 1:return kreturn -1

题目3:罗马数字转整数

  • 题号:13
  • 难度:简单
  • https://leetcode-cn.com/problems/roman-to-integer/

罗马数字包含以下七种字符: I, V, X, L,C,DM

字符          数值
I             1
V             5
X             10
L             50
C             100
D             500
M             1000

例如, 罗马数字 2 写做II,即为两个并列的 1。12 写做XII,即为X + II。 27 写做XXVII, 即为XX + V + II

通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做IIII,而是IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为IX。这个特殊的规则只适用于以下六种情况:

I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。

给定一个罗马数字,将其转换成整数。输入确保在 1 到 3999 的范围内。

示例 1:

输入:"III"
输出: 3

示例 2:

输入: "IV"
输出: 4

示例 3:

输入: "IX"
输出: 9

示例 4:

输入: "LVIII"
输出: 58
解释: L = 50, V= 5, III = 3.

示例 5:

输入: "MCMXCIV"
输出: 1994
解释: M = 1000, CM = 900, XC = 90, IV = 4.

思路:利用字典的方式

把字典当作一个存储容器,key 存储罗马字符的所有组合,value 存储该组合代表的值。

每次取一个字符,判断这个字符之后是否还有字符。如果有,则判断这两个字符是否在字典中,如果存在则取值。否则,按照一个字符去取值即可。

C# 语言

  • 执行结果:通过
  • 执行用时:120 ms, 在所有 C# 提交中击败了 42.16% 的用户
  • 内存消耗:25.8 MB, 在所有 C# 提交中击败了 5.27% 的用户
public class Solution
{public int RomanToInt(string s){Dictionary<string, int> dic = new Dictionary<string, int>();dic.Add("I", 1);dic.Add("II", 2);dic.Add("IV", 4);dic.Add("IX", 9);dic.Add("X", 10);dic.Add("XL", 40);dic.Add("XC", 90);dic.Add("C", 100);dic.Add("CD", 400);dic.Add("CM", 900);dic.Add("V", 5);dic.Add("L", 50);dic.Add("D", 500);dic.Add("M", 1000);int result = 0;int count = s.Length;int i = 0;while (i < count){char c = s[i];if (i + 1 < count && dic.ContainsKey(s.Substring(i, 2))){result += dic[s.Substring(i, 2)];i += 2;}else{result += dic[c.ToString()];i += 1;}}return result;}
}

Python 语言

  • 执行结果:通过
  • 执行用时:72 ms, 在所有 Python3 提交中击败了 24.93% 的用户
  • 内存消耗:13.5 MB, 在所有 Python3 提交中击败了 5.05% 的用户
class Solution:def romanToInt(self, s: str) -> int:dic = {"I": 1, "II": 2, "IV": 4, "IX": 9, "X": 10, "XL": 40, "XC": 90,"C": 100, "CD": 400, "CM": 900, "V": 5,"L": 50, "D": 500, "M": 1000}result = 0count = len(s)i = 0while i < count:c = s[i]if i + 1 < count and s[i:i + 2] in dic:result += dic[s[i:i + 2]]i += 2else:result += dic[c]i += 1return result

题目4:LRU缓存机制

  • 题号:146
  • 难度:中等
  • https://leetcode-cn.com/problems/lru-cache/

运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制。它应该支持以下操作: 获取数据 get 和 写入数据 put 。

获取数据 get(key) - 如果密钥 (key) 存在于缓存中,则获取密钥的值(总是正数),否则返回 -1。

写入数据 put(key, value) - 如果密钥不存在,则写入其数据值。当缓存容量达到上限时,它应该在写入新数据之前删除最近最少使用的数据值,从而为新的数据值留出空间。

进阶:

你是否可以在 O(1) 时间复杂度内完成这两种操作?

示例:

LRUCache cache = new LRUCache( 2 /* 缓存容量 */ );cache.put(1, 1);
cache.put(2, 2);
cache.get(1);       // 返回  1
cache.put(3, 3);    // 该操作会使得密钥 2 作废
cache.get(2);       // 返回 -1 (未找到)
cache.put(4, 4);    // 该操作会使得密钥 1 作废
cache.get(1);       // 返回 -1 (未找到)
cache.get(3);       // 返回  3
cache.get(4);       // 返回  4

思路:利用 字典 + 单链表 的方式

计算机的缓存容量有限,如果缓存满了就要删除一些内容,给新内容腾位置。但问题是,删除哪些内容呢?我们肯定希望删掉哪些没什么用的缓存,而把有用的数据继续留在缓存里,方便之后继续使用。那么,什么样的数据,我们判定为「有用的」的数据呢?

LRU 缓存淘汰算法就是一种常用策略。LRU 的全称是 Least Recently Used,也就是说我们认为最近使用过的数据应该是是「有用的」,很久都没用过的数据应该是无用的,内存满了就优先删那些很久没用过的数据。

把字典当作一个存储容器,由于字典是无序的,即 dict 内部存放的顺序和 key 放入的顺序是没有关系的,所以需要一个 list 来辅助排序。

C# 语言

  • 状态:通过
  • 18 / 18 个通过测试用例
  • 执行用时: 392 ms, 在所有 C# 提交中击败了 76.56% 的用户
  • 内存消耗: 47.9 MB, 在所有 C# 提交中击败了 20.00% 的用户
public class LRUCache
{private readonly List<int> _keys;private readonly Dictionary<int, int> _dict;public LRUCache(int capacity){_keys = new List<int>(capacity);_dict = new Dictionary<int, int>(capacity);}public int Get(int key){if (_dict.ContainsKey(key)){_keys.Remove(key);_keys.Add(key);return _dict[key];}return -1;}public void Put(int key, int value){if (_dict.ContainsKey(key)){_dict.Remove(key);_keys.Remove(key);}else if (_keys.Count == _keys.Capacity){_dict.Remove(_keys[0]);_keys.RemoveAt(0);}_keys.Add(key);_dict.Add(key, value);}
}/*** Your LRUCache object will be instantiated and called as such:* LRUCache obj = new LRUCache(capacity);* int param_1 = obj.Get(key);* obj.Put(key,value);*/

Python 语言

  • 执行结果:通过
  • 执行用时:628 ms, 在所有 Python3 提交中击败了 12.15% 的用户
  • 内存消耗:22 MB, 在所有 Python3 提交中击败了 65.38% 的用户
class LRUCache:def __init__(self, capacity: int):self._capacity = capacityself._dict = dict()self._keys = list()def get(self, key: int) -> int:if key in self._dict:self._keys.remove(key)self._keys.append(key)return self._dict[key]return -1def put(self, key: int, value: int) -> None:if key in self._dict:self._dict.pop(key)self._keys.remove(key)elif len(self._keys) == self._capacity:self._dict.pop(self._keys[0])self._keys.remove(self._keys[0])self._keys.append(key)self._dict[key] = value# Your LRUCache object will be instantiated and called as such:
# obj = LRUCache(capacity)
# param_1 = obj.get(key)
# obj.put(key,value)

注意,这两行代码不能颠倒顺序,否则dict中就不会存在_keys[0]了。

self._dict.pop(self._keys[0])
self._keys.remove(self._keys[0])

总结

本篇图文总结了字典的概念,以及 C# 和 Python语言对这种常用数据结构类型的封装。并以四道Leetcode习题举例说明字典作为一种容器的具体应用。好了,今天就到这里吧!Flag进度为40%,See You!


往期活动

LSGO软件技术团队会定期开展提升编程技能的刻意练习活动,希望大家能够参与进来一起刻意练习,一起学习进步!

  • Python基础刻意练习活动即将开启,你参加吗?
  • Task01:变量、运算符与数据类型
  • Task02:条件与循环
  • Task03:列表与元组
  • Task04:字符串与序列
  • Task05:函数与Lambda表达式
  • Task06:字典与集合
  • Task07:文件与文件系统
  • Task08:异常处理
  • Task09:else 与 with 语句
  • Task10:类与对象
  • Task11:魔法方法
  • Task12:模块

我是 终身学习者“老马”,一个长期践行“结伴式学习”理念的 中年大叔

我崇尚分享,渴望成长,于2010年创立了“LSGO软件技术团队”,并加入了国内著名的开源组织“Datawhale”,也是“Dre@mtech”、“智能机器人研究中心”和“大数据与哲学社会科学实验室”的一员。

愿我们一起学习,一起进步,相互陪伴,共同成长。

后台回复「搜搜搜」,随机获取电子资源!
欢迎关注,请扫描二维码:

相关文章:

[WCF REST] 解决资源并发修改的一个有效的手段:条件更新(Conditional Update)

条件获取&#xff08;Conditional Update&#xff09;可以避免相同数据的重复传输&#xff0c;进而提高性能。条件更新&#xff08;Conditional Update&#xff09;用于解决资源并发操作问题。如果我们预先获取一个资源进行修改或者删除&#xff0c;条件更新检验帮助我们确认资…

Netty 之 Zero-copy 的实现(下)

上一篇说到了 CompositeByteBuf &#xff0c;这一篇接着上篇的讲下去。 FileRegion 让我们先看一个Netty官方的example // netty-netty-4.1.16.Final\example\src\main\java\io\netty\example\file\FileServerHandler.java public void channelRead0(ChannelHandlerContext ctx…

Java中final关键字如何使用?

final变量只能赋值一次&#xff0c;赋值的方式有三种&#xff1a; 1)声明变量时直接赋值; 2)非静态成员变量在{}块中赋值&#xff0c;静态成员变量在static{}块中赋值; 3)非静态成员变量在构造方法中赋值。 final修饰类 final类不能被继承&#xff0c;因此不会有子类。final类中…

技术图文:双指针在求解算法题中的应用

背景 前段时间&#xff0c;在知识星球立了一个Flag&#xff0c;这是总结Leetcode刷题的第三篇图文。 理论部分 Python list 的源码地址&#xff1a; https://github.com/python/cpython/blob/master/Include/listobject.h https://github.com/python/cpython/blob/master/O…

【CSON原创】HTML5游戏框架cnGameJS开发实录(外部输入模块篇)

返回目录 1.为什么我们需要外部输入模块&#xff1f; 在游戏中我们常常用到类似这样的操作&#xff1a;鼠标点击某位置&#xff0c;玩家对象移动到该位置&#xff0c;或者按鼠标方向键&#xff0c;玩家向不同方向移动&#xff0c;等等。这些操作无一不用与外部输入设备打交道。…

中国科协(深圳)海外人才离岸创新创业基地源创力中心开业,主打国际创业服务...

2017年9月28日&#xff0c;由深圳市科学技术协会主办、深圳市罗湖区人民政府支持&#xff0c;深圳市源创力离岸创新中心承办的“梧桐山基地开园仪式暨梧桐湾未来论坛”于深圳举办。 据介绍&#xff0c; “中国科协&#xff08;深圳&#xff09;海外人才离岸创新创业基地”是在深…

找java培训机构如何挑选

​ java技术在互联网行业的需求率还是非常高的&#xff0c;它的发展前景非常可观&#xff0c;想要学好java技术&#xff0c;那么寻找一个好的java培训机构是非常重要的&#xff0c;那么找java培训机构如何挑选呢?来看看下面的详细介绍。 ​  找java培训机构如何挑选? 在选择…

技术图文:集合技术在求解算法题中的应用

背景 前段时间&#xff0c;在知识星球立了一个Flag&#xff0c;这是总结Leetcode刷题的第四篇图文。 理论部分 HashSet C# 语言中 HashSet<T> 是包含不重复项的无序列表&#xff0c;称为“集合(set)”。由于set是一个保留字&#xff0c;所以用HashSet来表示。 public…

sql server 2008数据导入Oracle方法

试了几种sql server数据导入Oracle的方法&#xff0c;发现还是sql server 的导入导出工具最好使。使用方法很简单&#xff0c;照着向导做就可以。不过使用中需要注意以下几点&#xff1a; 系统盘需要足够大。因为SSIS的临时文件都是生成在系统盘的&#xff0c;系统盘太小&#…

nginx+tomcat配置负载均衡集群

一、Hello world 1、前期环境准备 准备两个解压版tomcat&#xff0c;如何同时启动两个tomcat&#xff0c;方法如下&#xff1a; 首先去apache tomcat官网下载一个tomcat解压版。 解压该压缩包&#xff0c;生成n份tomcat 分别命名为 tomcat1&#xff0c;tomcat2&#xff0c; 然后…

参加UI设计培训要学多久

​ UI设计要学习的内容有很多&#xff0c;至于参加UI设计培训要学多久这个问题&#xff0c;要看你的学习能力和所在的UI设计培训机构都教些什么&#xff0c;我们来看看下面的详细介绍。 参加UI设计培训要学多久?千锋教育的课程大纲分享给大家参考学习一下&#xff1a; 阶段一&…

技术图文:C# 语言中的扩展方法

背景 前段时间&#xff0c;在知识星球立了一个Flag&#xff0c;在总结 Leetcode 刷题的第五篇图文时遇到了扩展方法 这个知识点&#xff0c;于是先总结一下。 1&#xff0e;扩展方法概述 扩展方法能够向现有类型“添加”方法&#xff0c;而无需创建新的派生类型、重新编译或以…

如何在ToolBar中显示文字和图标,自定义图标大小,并和MenuItem关联

要注意以下几个方面,先后顺序未必正确,有可能多设几次 1.设置ToolBar可以显示文字ToolBar.ShowCaption : True;2.设置ToolButton大小ImageList.WidthImageList.Height3.设置菜单关联4.设置运行时显示图标(这个是关键)ToolButton.Menuitum.ImageIndex要保证MenuItem所在的MainMe…

C#程序调用cmd执行命令

酷小孩 原文 C#程序调用cmd执行命令 对于C#通过程序来调用cmd命令的操作&#xff0c;网上有很多类似的文章&#xff0c;但很多都不行&#xff0c;竟是漫天的拷贝。我自己测试整理了一下。 代码&#xff1a; string str Console.ReadLine();System.Diagnostics.Process p new …

Java虚拟机的内存空间有几种

Java虚拟机的内存空间有几种&#xff1f;(1)问题分析&#xff1a; JVM(虚拟机)的内存划分 不同的数据使用的是哪一块内存空间 (2)核心答案讲解&#xff1a; Java虚拟机有那几块内存空间&#xff1a; 1)栈内存&#xff1a;方法运行时所进入的内存&#xff0c;里面还会存储程序的…

技术图文:排序技术在求解算法题中的应用

背景 前段时间&#xff0c;在知识星球立了一个Flag&#xff0c;这是总结Leetcode刷题的第五篇图文。 理论部分 C# 中的排序 对集合类的排序&#xff0c;我们通常使用位于 System.Core 程序集&#xff0c;System.Linq命名空间下&#xff0c;Enumerable静态类中的扩展方法。 …

如果有电脑——计算机达人成长之路(36)

5、电脑情缘&#xff08;一&#xff09;王新华的电脑 现在的大学生一般都有一个工具&#xff0c;就是计算机&#xff0c;尤其是计算机科学系的学生&#xff0c;几乎人手一台。对此&#xff0c;木鸿飞只能深深的说上一句&#xff1a;“幸福啊&#xff01;” 现在人可能不能了解这…

Javascript中二进制数据处理方法

Javascript中二进制数据处理方法 转载于:https://www.cnblogs.com/motadou/archive/2012/02/19/2358514.html

正规Java培训机构是什么样的

​ 正规Java培训机构是什么样的?这对于很多想真正学习到java技术的人来说是非常重要的&#xff0c;选择一个适合自己的靠谱的Java培训机构&#xff0c;学有所成工作也是比较稳定的&#xff0c;下面我们来看看详细的介绍。 ​  正规Java培训机构是什么样的?其实对于这个问题…

《40期》 我们要把世纪末日变成重生日

2012年&#xff0e;传说中一个会是世纪末日的一年。&#xff08;ps&#xff1a;电影看多了……- _-!!!&#xff09;&#xff0c;但是寒假过后的北京。天气却是十分的晴朗、出奇的好。而就在今天也就是2012年2月9日40期的开班典礼就选了这一天。地点就是在育荣教学园区2栋教学楼…

LeetCode刷题宝典 V1.0 PDF下载

前段时间&#xff0c;在知识星球立了一个Flag&#xff0c;现在 Flag 的进度为 100%&#xff0c;很是开心。 为了大家学习的方便&#xff0c;所以整理了这份150多页的小册子。可以作为学习数据结构与算法或备考计算机类研究生的参考资料&#xff0c;希望对大家有所帮助。 小册子…

机器学习:信用风险评估评分卡建模方法及原理

#课程介绍 信用风险评分卡为信用风险管理提供了一种有效的、经验性的解决方法&#xff0c;是消费信贷管理中广泛应用的技术手段。 评分卡是信用风险评估领域常见的建模方法。评分卡并不加单对应于某一种机器学习算法&#xff0c;而是一种通用的建模框架&#xff0c;讲原始数据通…

0基础学怎么学习python

​ Python相对于其他编程语言来说是比较简单的&#xff0c;非常适合零基础的小白学习&#xff0c;想要进入到互联网行业&#xff0c;可以优先选择学习Python&#xff0c;那么下面小编就来为大家详细的介绍一下0基础学怎么学习python? ​  0基础学怎么学习python? 1、要读书…

nginx技术(2)nginx的配置详解

nginx的配置 1&#xff0c;启动nginx 1234567[rootcentos6 nginx-1.2.9]# /usr/sbin/nginx -c /etc/nginx/nginx.conf 启动nginx [rootcentos6 nginx-1.2.9]# ps -ef|grep nginx 查看进程 root 5479 1 0 04:15 ? 00:00:00 nginx: master process /usr/sbin/nginx -…

javascript 基础篇2 数据类型,语句,函数

文章里如果有错误的话&#xff0c;希望能帮忙指正~我也是边看视频边学习中&#xff0c;这个算是个笔记吧~自认为总结出来的东西比看视频要节省点时间~能帮到别人最好了~帮不到也起码恩能帮到我自己 嘿~ 写内容之前废话一句&#xff1a;因为旧版有些浏览器不支持javascript脚本&…

技术图文:如何在Python中定义二维数组?

背景 前几天&#xff0c;有位同学问我如下的问题&#xff1a; “temp[0][0]修改后&#xff0c;为什么temp[1][0]、temp[2][0]也发生了变化&#xff1f;” “在Python中二维数组是怎样定义和使用的&#xff1f;” 今天就来谈谈这个问题。 技术分析 在 C# 语言中有直接定义二…

javascript的垃圾回收机制指的是什么

定义&#xff1a;指一块被分配的内存既不能使用&#xff0c;又不能回收&#xff0c;直到浏览器进程结束。 像 C 这样的编程语言&#xff0c;具有低级内存管理原语&#xff0c;如 malloc()和 free()。开发人员使用这些原语显式地对操作系统的内存进行分配和释放。 而 JavaScript…

技术图文:Matlab向量 VS. Python列表

背景 前段时间在知识星球上立了一个Flag&#xff0c;至少写10篇关于 Python&#xff0c;Matlab 和 C# 对比的总结。这是第 1 篇&#xff0c;从创建结构、添加元素、删除元素、获取元素四个角度来对比 Matlab 的向量与 Python 的列表。 1. 向量/列表 的创建 1.1 直接法 Matla…

我的ExtJS学习之路 ——4

项目基本架子出来&#xff0c;然后就该考虑将封装好的gridpanel 和 tabpanel关联起来 既 点击树的叶子节点&#xff0c;将 gridpanel 展现在 tabpanel中 怎么关联呢&#xff1f; 【在之前的基础上的&#xff0c;重复的代码就不贴出来了】 我改变了 模拟数据的形式&#xff0c;注…

php CI框架输出空行问题排查

今天在使用 curl 命令行工具调试一个功能时&#xff0c;发现输出的内容总是会在最开始莫名其妙的多一行空行&#xff1a; 项目框架是 php 的 CodeIgniter&#xff0c;感觉这种问题在网上不好查找&#xff0c;因为可以确定这个是业务出现的问题&#xff0c;然后只能自己去定位查…