三数之和

go语言刷题:15. 三数之和

 

题目
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请找出所有和为 0 且不重复的三元组。

注意:答案中不可以包含重复的三元组。
示例 1:

输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
示例 2:

输入:nums = []
输出:[]
示例 3:

输入:nums = [0]
输出:[]

代码
本题的思路是:
1.现将数组进行排序
2.利用双指针进行遍历,并跳过重复值,这里跳过重复值操作分两块,*块是大循环中,第二块是小循环

func threeSum(nums []int) [][]int {
//1.排序
for i := 0; i < len(nums); i++ {
for j := 0; j < len(nums)-1-i; j++ {
if nums[j] > nums[j+1] {
nums[j+1], nums[j] = nums[j], nums[j+1]
}
}
}

//2.初始化变量值
results := [][]int{}

//3.进行遍历
for i := 0; i < len(nums)-2; i++ {
//初始化索引值
left, right := i+1, len(nums)-1
//边界条件
if nums[i] > 0 {
break
}
//跳过重复值(大循环)
//如果当前值和上一个值相等,则跳过进行下一次循环
if i > 0 && nums[i] == nums[i-1] {
continue
}
//当左索引值<右索引值
for left < right {
//跳过重复值
//当三者和==0时,加入结果列表,并排除重复值,同时还更新左、右索引值
if nums[i]+nums[left]+nums[right] == 0 {
results = append(results, []int{nums[i], nums[left], nums[right]})
//跳过重复值(小循环)
for left < right && nums[left] == nums[left+1] {
left++
}
for left < right && nums[right] == nums[right-1] {
right–
}
left++
right–
} else if nums[i]+nums[left]+nums[right] < 0 {
left++
} else {
right–
}
}

}
return results
}

句子相似性 III

eetCode 1813. 句子相似性 III

题目

%title插图%num
思路
这道题思路不难想,但是代码实现细节较多。我在做这道题时首先想的是区分长短句,如果短句中包含长句中没有的单词,则结果一定是false(因为短句只能通过增加句子补充到长句,但是不能删除句子)。之后因为题目要求只能在短句中插入一个句子使其变成长句,换句话说长句中出现的短句中没有的单词必须全部是相邻的,否则至少要插入两个以上的句子才可以。因此这里可以遍历长句,同时设定辅助变量并初始化为0,辅助变量用来遍历短句。如果当前遍历时出现了短句中没有的单词,则说明出现了断点,统计断点个数。当断点数量大于等于2时说明结果为false。特别地,如果短句被成功遍历完但长句还没遍历完,则这时只需判断之前是否出现过断点,如果未出现过则直接返回true,否则之后的断点数一定大于等于2,返回false。

代码
class Solution:
def areSentencesSimilar(self, sentence1: str, sentence2: str) -> bool:
if sentence1==sentence2:
return True
list1=sentence1.split()
list2=sentence2.split()
if len(list1)==len(list2):
return False
if len(list2)>len(list1):
list1,list2=copy.deepcopy(list2),copy.deepcopy(list1)
#print(list1,list2)
if len(list1)>len(list2):
s=0
flag=1
count=1
vis={}
for i in range(len(list1)):
vis[list1[i]]=i
for temp in list2: #判断短句中是否出现了长句中没有的单词
if vis.get(temp)==None:
return False
for i in range(len(list1)):
if count<0:
return False
if s==len(list2): #处理短句已遍历完但长句还没有遍历完的情况
if count==0:
return False
else:
return True
if list1[i]==list2[s]:
if not flag:
flag=1
s+=1
else:
if flag:
flag=0
count-=1

return True

硬盘如何检测才够全面?

*近身边发生好几次硬盘故障,甚至有一次丢失了大量个人数据,十分痛苦。

于是我想做到在服务器上定期检测磁盘。


我一般租用的服务器到手,都会测试硬盘的习惯,

一般用 smartctl -H 和 badblocks -vn 命令检测硬盘

sudo smartctl -H /dev/sda
sudo badblocks -vn /dev/sda

但是有次发现,本来正常工作的、作为系统盘硬盘,

因为我突发奇想,试了下 badblocks -w 测试写入,命令运行了快一整天,没碰到什么问题,

后来也通过了这两个测试,但是即使重新分区,再装系统就不能启动了。

所以可见这种方式测试磁盘也不是所有问题都能侦测出来。


所以,

有没有什么办法能比较全面地检测硬盘,

*好是数据不会丢的办法,

这样就能在所有服务器上面定期检测了。

• 2017-11-09 08:22:18 +08:00
mkdong 1
mkdong 2017-08-21 14:30:44 +08:00 via iPhone
数据的话还是多备份比较靠谱吧,硬盘检测也没法避免未来的损坏的…
ahhui 2
ahhui 2017-08-21 14:33:21 +08:00
备份比测试靠谱啊!显然你需要一个定期备份的工具,而不是定期去查硬盘有没有故障。说真的,有的故障你用软件也查不出来,比如突然一锤子下去。当然这是个*端的比喻,我想说的是,等你检测到故障的时候,也可能意味着数据本身就已经丢失了。何不防患于未然,多做备份呢?
oldcai 3
oldcai 2017-08-21 14:38:11 +08:00
@mkdong
@ahhui
备份之外的策略,备份也会丢上次备份到这次之间的数据。
有些不常用到的机器,可能硬盘坏了几天才发现有问题,但是备份数据甚至也被弄脏了或者超期了。
gamexg 4
gamexg 2017-08-21 15:03:00 +08:00
阵列…
davidyin 5
davidyin 2017-08-21 15:08:08 +08:00
重要性*高的,用放在 dropbox。
一般的就用 NAS 定期备份。每个月检查一下。
7654 6
7654 2017-08-21 15:13:45 +08:00
检测的越多越频繁坏的越快,这不是玄学,这是真实体验
benbenzhangqi 7
benbenzhangqi 2017-09-10 14:00:04 +08:00 via iPhone
@oldcai 7 天 9 “`丶 /卜
oldcai 8
oldcai 2017-09-10 17:45:14 +08:00
@benbenzhangqi なに?
popkara 9
popkara 2017-09-26 20:55:18 +08:00
硬盘(固态 /机械)这种东西没办法测试的,无论是全盘扫描还是 S.M.A.R.T。
否则也就没有做冗余的必要了,但是可以通过一些方法来降低故障造成的损失。
yingfengi 10
yingfengi 2017-11-09 08:22:18 +08:00 via Android
灾备

有效的字母异位词(题目+原理+python代码实现)

有效的字母异位词(题目+原理+python代码实现)

查找排序习题
有效的字母异位词
有效的字母异位词

%title插图%num
class Solution(object):
def isAnagram(self, s, t):
“””
:type s: str
:type t: str
:rtype: bool
“””
ss = list(s) #字符串不可排序,转化成列表,一个字母是一个元素。
tt = list(t)
ss.sort() #python的排序是一种基于归并排序的排序方法,时间复杂度为nlogn。
tt.sort()
return ss == tt

排序法一行代码也可以完成,但是时间用的也比较多。

return sorted(list(s)) == sorted(list(t))
1
快一点的方法,用字典的代码,两个循环复杂度O(n)。

dict1 = {} #两个字典保存字母出现的数量。形如:{‘a’:1, ‘b’:2}
dict2 = {}
for ch in s:
#dict1[ch] += 1 这样写不行,因为一开始没有键的话会报错。
dict1[ch] = dict1.get(ch,0) + 1 # 如果ch在键里面,get得到键值;如果ch不在键里面,返回0(相当于开了一个键)
for ch in t:
dict2[ch] = dict2.get(ch,0) + 1
return dict1 == dict2

推荐建站空间

想搭个 wordpress 的 blog ,建个社区业主交流的论坛,想找个稳定便宜的空间,求推荐。

JackyBao 1
JackyBao 2017-02-13 14:25:21 +08:00
https://www.v2ex.com/t/340110 这个,不能再便宜了。
xiaoz 2
xiaoz 2017-02-13 14:36:19 +08:00
1.是否需要备案,使用国内的还是考虑海外的?
2.打算使用 VPS 还是虚拟主机,对 SSL 是否有要求。
3.不想折腾可以考虑老薛香港主机,支持部署 SSL : https://www.xiaoz.me/archives/7560/ (文章链接含 AFF )
nightwind 3
nightwind 2017-02-13 14:46:16 +08:00
[锐壳云还可以]( https://www.rkecloud.com/?refcode=84d1e126ad)(含推广)
xeis 4
xeis 2017-02-13 14:50:54 +08:00 via Android
@xiaoz aff 对我购买价格有影响么?没影响就带 aff 进去
xiaoz 5
xiaoz 2017-02-13 15:06:23 +08:00
@xeis 对您没有任何影响,只是会给我返利而已,使用优惠码的情况: xiaoz25 下还会更便宜。
webjin1 6
webjin1 2017-02-13 15:14:14 +08:00
现在 vps 才 5 美元左右一个月,很好的了,这点费用也就是 2 包烟的钱,负担不起吗?那可以找人合租 1 台 vps 。
xgfan 7
xgfan 2017-02-13 15:53:31 +08:00 via Android
hostker 强烈推荐。
xeis 8
xeis 2017-02-13 16:25:28 +08:00 via Android
@xiaoz 已使用 aff 和优惠码,多谢推荐
xeis 9
xeis 2017-02-13 16:26:09 +08:00 via Android
@webjin1 vps 不会搞,装个论坛和博客, webhost 够啦
xeis 10
xeis 2017-02-13 16:27:28 +08:00 via Android
@xiaoz 另外搬瓦工要到期了,有可装 ss 的 vps 推荐么

xiaoz 11
xiaoz 2017-02-13 17:04:19 +08:00
@xeis 如果要装 ss ,推荐选择 KVM 的机器, KVM 装锐速或者 google bbr 没有问题,方便对 ss 加速,目前我在用的有 vultr 和 hostus 这两家,下面链接带有 AFF
vultr : https://www.xiaoz.me/archives/7218
hostus : https://www.xiaoz.me/archives/7502 (推荐选择 KVM )
GavinHsueh 12
GavinHsueh 2017-08-29 15:31:44 +08:00
1.做 blog 的话,个人真不建议用 WP,因为我之前就是用 WP 搭建的,用了两三年,但因为插件、垃圾信息、安全等原因改用了蝉知企业门户系统,我的博客:www.xuecaijie.com
2.你说的免费且稳定,我个人觉得鱼和熊掌不可兼得,一分钱一分货。我原本用的香港主机,免备案,后来转为阿里云 ECS 云服务器。
3.要说性价比的话,建议你试试这个吧:www.zsite.com
mgd 13
mgd 2018-12-26 15:43:54 +08:00 via Android
直接用国外的,tophosting.github.io
xiliu 14
xiliu 2019-10-22 15:05:59 +08:00
可以考虑尝试试用下新玩法, *低成本,serverless web: https://yq.aliyun.com/articles/721594

有没有这样的一款 android 机?

  1. CPU 是 765G 这样功耗比较低,性能也够用的
  2. 有 NFC,可以在上海直接刷交通卡的
  3. 重量低于 180 克的

求推荐:

71 条回复    2021-02-23 10:05:43 +08:00
nicevar
    1

nicevar   44 天前

一般的手机都到 200 克上下了,能想到的是 Pixel 4A 了
qdwang
    2

qdwang   44 天前

@nicevar 谢谢,Pixel 4A 可以装程序刷交通卡吗?
woailt12819
    3

woailt12819   44 天前 via Android

这需求,pixel4a 、5 妥妥的
fredcc
    4

fredcc   44 天前 via Android

别闹,不是国行手机刷什么 NFC 交通卡
Dox
    5

Dox   44 天前

公交卡要怎么操作?需要下载 app 吗?
shiao56
    6

shiao56   44 天前 via Android

1 、2 好满足,粗粮菊花一大堆,但是同时满足 3 的就难了
reedthink
    7

reedthink   44 天前

vivo x60pro 178g,三星猎户座 1080,nfc 有,至于支不支持上海交通卡,我就不清楚了。
Quarter
    8

Quarter   44 天前 via iPhone

小米 6 ????
depress
    9

depress   44 天前 via Android

oppo reno5 pro
maskerTUI
    10

maskerTUI   44 天前

华为 p40
qdwang
    11

qdwang   44 天前

@depress oppo reno5 倒是满足了。谢谢拉
qdwang
    12

qdwang   44 天前

@depress 搞错了。。reno5 没 nfc 啊。。。好吧。pro 的 cpu 太高级又贵了
HanMLee
    13

HanMLee   44 天前

@qdwang 记得有一种 NFC-SIM 去营业厅可以换 能刷交通卡
qdwang
    14

qdwang   44 天前

@reedthink 我看 x60 就行了,cpu 一样,nfc 也有。。。看上去挺符合了。谢谢拉
yingfengi
    15

yingfengi   44 天前 via Android

性能也够用(这个似乎不存在)
qdwang
    16

qdwang   44 天前

@HanMLee 还有这种,我研究一下,谢谢提供这个消息
iVeego
    17

iVeego   44 天前 via Android   ❤️ 1

低端机配置 NFC 的只有小米系
qdwang
    18

qdwang   44 天前

@iVeego 看了一下,还真是
0gys
    19

0gys   44 天前 via iPhone

看标题我就想到只有 iPhone se 能满足你,哈哈哈?
depress
    20

depress   44 天前 via Android

@qdwang pro 还是 765,你怕看的是 pro+吧
villivateur
    21

villivateur   44 天前 via Android

小米 6,相信我
someonesnone
    22

someonesnone   44 天前

765G 性能不够的,我的 K30 经常卡
nikolai
    23

nikolai   44 天前 via iPhone

洋垃圾 G7/8 ?
leekayui
    24

leekayui   44 天前

Pixel5
1 √
2 X
3 √
stephenyin
    25

stephenyin   44 天前

好奇要求重量是什么场景的需求?
likaci
    26

likaci   44 天前

公交卡改用小米手环
qdwang
    27

qdwang   44 天前

@someonesnone 什么场景下卡呀。。。
qdwang
    28

qdwang   44 天前

@stephenyin 就是想用轻一点的手机。。。没什么特殊场景
hahahahaha234
    29

hahahahaha234   44 天前

三星 s10 咸鱼捡一个
Whalko
    30

Whalko   43 天前

@qdwang #15 上海的 NFC-SIM 早就没了,我之前研究过……
另外附议 #25,改用手环刷卡,这就是目前我用 Pixel 的解决方案。
shuoshuxx
    31

shuoshuxx   43 天前

小米 9
zjl03505
    32

zjl03505   43 天前

三星 S10
reedthink
    33

reedthink   43 天前

@qdwang 我也对现在 200g 以上的”大哥大“提不起兴趣,现在用着 se2020
SNOOPY963
    34

SNOOPY963   43 天前 via Android

一加 8T 么,188g,还能忍
m4d3bug
    35

m4d3bug   43 天前 via Android

华为 p40 185g 5Gsoc 低功耗
Zy143L
    36

Zy143L   43 天前 via Android

建议放弃需求 3
锻炼下臂力蛮不错的
Mikewangyankkk
    37

Mikewangyankkk   43 天前

@reedthink 支持,VIVO 钱包添加即可,X60Pro 唯一的缺点是太贵
hs0000t
    38

hs0000t   43 天前 via Android

搜了下手头的荣耀 v20,正好 180g
CPU 是麒麟 980,续航凑合,开省电模式能用一天半,LCD 屏,耳机孔 红外遥控 呼吸灯 指纹,当时 1699 买的(现在多少钱不清楚)
hs0000t
    39

hs0000t   43 天前 via Android

顺便慎买米 6,电池太小了,功耗再低也撑不住续航,尤其是雷军天天远程施法副优化
JensenQian
    40

JensenQian   43 天前

@Whalko #30 其实还有个办法,把实体卡写进去,对岸的湾湾就是这么干把对岸的公交卡弄进某米的手环
JensenQian
    41

JensenQian   43 天前 via Android   ❤️ 1

sim 卡公交如果上海不行的话可以用江苏移动的小蓝卡,上海在互通列表里面。我朋友的韩版三星就是这么用公交卡的。具体咋样你看下
JensenQian
    42

JensenQian   43 天前 via Android

@JensenQian 对了,中国移动去年底整了个超级 sim 卡出来,可以免费换卡的,中国移动手机 app 里面就可以换,我自己因为米 8 本身就能开卡,我没怎么关注,有兴趣的话看下网上有人有详细评测的
S179276SP
    43

S179276SP   43 天前 via Android

华为 P30,还有耳机孔,三星屏幕。
JensenQian
    44

JensenQian   43 天前 via Android

@JensenQian 还有微信腾讯弄的乘车卡小程序,不过不支持上海地铁
alfchin
    45

alfchin   43 天前 via iPhone

@reedthink vivo 支持
66beta
    46

66beta   43 天前

需求 1 是因为价格敏感的话:二手 一加 8
murmur
    47

murmur   43 天前

765g 属于低功耗么,低性能差不多吧
JensenQian
    48

JensenQian   43 天前

楼主个人觉得还是买个旗舰机,现在虽然差不多,但是相信我,两三年之后,同年的 7 系列的 U 肯定没 8 系的强,也没贵多少,不过这 180 克的小屏旗舰真的很少了
带 NFC 的一般都是旗舰机才会带
ios 的话就 se2 不支援 5G 这个可以不考虑了,12mini 和 12 都可以,12pro 超了 7 克其实也还行
三星的 S21 和 S20 你可以考虑下,S21 171 克虽然缩水严重,但是毕竟三星旗舰
S20 也是
一加的话去年的一加 8 和 8T,8T 超了 8 克,一加的话你可以考虑等下今年的一加 9 系列
某米的机子好像就没怎么轻的,去年小米的支持 NFC 机子的重量就没轻的,整个 K30 和小米 10 系列就没低于 200 的,估计是前年小米 9 3200 电池被喷惨了的后果,不过好处电池这几台都 4000 多,甚至 5000 了,支持 nfc 的红米 note9pro 也是 200 多
小米 11 的 196g 算轻的了,不过电池 4600
马上要出的 K40 系列电池也是 4000 多,估计也是 200 多重量
某为的话 P40 也是缩的很严重,你等波 P50 吧,不过某为不支持 gms,而且很难买
mate40 的话超了 4g
不过如果 765G 的手机超过 2500 的话个人觉得还是换成 870 或者 888 的机子吧,重量稍微超点也就超点,重量大换电池大点我也稍微能忍受
dicbldicbl
    49

dicbldicbl   43 天前

无脑买 iphone xr 或者 11 吧
337136897
    50

337136897   43 天前

@nicevar iphone12 还不到 160g
JokeEnd
    51

JokeEnd   43 天前

LG wing
killergun
    52

killergun   43 天前

小米手环?
DL9412
    53

DL9412   43 天前

在用 s10e 当备用机,尺寸重量性能都挺满意的,功耗续航也还可以接受,比主力 iphone 强多了
JensenQian
    54

JensenQian   43 天前

@JensenQian #48 不过楼主*好真的还要明确一下自己的预算,765G 现在觉得能用,但是以后真的不一定能用了
毕竟这玩意的 cpu 也就个 835 水平,gpu 还不如 835,除了支持 5G 和功耗控制的差不多,真的每笔 835 强多少,个人觉得楼主有钱的话还是买个 865,870,888 的手机
BadAngel
    55

BadAngel   43 天前

你需要一张卡+一部老人机,狗头
qdwang
    56

qdwang   43 天前

@JensenQian 嗯嗯,要重新考虑一下
unclemcz
    57

unclemcz   43 天前

k30 勉强符合吧,重量超出了;
另外 765 功耗也没有很低,我的 k305G 中度使用,一天 1 充吧;
偶尔有断流现象,游戏用户需要注意,对我影响倒不是很大。
keymao
    58

keymao   43 天前

低端机配置 NFC 的只有小米系

redmi note 8 pro 4500mah 重量多 10g ?

LouGaZen
    59

LouGaZen   43 天前

千万别碰 765G,之前脑抽出了 k30p 入手 mi10lite,结果在 miui12 下经常掉帧
draguo
    60

draguo   43 天前

现在主要重量基本就是电池,这个重量的续航都有问题
Vegetables
    61

Vegetables   43 天前

vivo x60
zexinwu84
    62

zexinwu84   43 天前 via Android

samsung s21 (167g)
no1xsyzy
    63

no1xsyzy   43 天前

上海交通卡是 CPU 卡,不能写进其他卡里面,只能手机的发行商与上海公共交通卡股份有限公司谈拢……
moonkiller
    64

moonkiller   43 天前

别碰小米
断流太严重了
pkookp8
    65

pkookp8   43 天前 via Android

@moonkiller 看清楼主需求,nfc 要什么网络
Lemeng
    66

Lemeng   43 天前

NFC 一次都没用过。哈哈,
ciaoly
    67

ciaoly   43 天前 via Android

@HanMLee 这种得配合手机 NFC 硬件才能用的。
ciaoly
    68

ciaoly   43 天前 via Android

NFC 这块别限制的太死的话可选方案也不少。只是刷公交的话,可以尝试 NFC 手环;或者办一张京津冀一卡通,淘宝买一套工具,把卡给溶了然后把线圈给贴到手机后盖上。(好像上海的地铁和公交都能刷京津冀一卡通这样子
pengyOne
    69

pengyOne   43 天前

OPPO K7,高通 765G 重量也刚好 180g,有 NFC

我给我妈买的,确实挺轻薄

chaoFanExcellent
    70

chaoFanExcellent   42 天前

前两年我给我妈买了个手机,挺轻的,红米,然后我妈弄丢了,自己买了个,然后她还嫌弃我给买的手机,说太轻了,自己买了个重的。
squarer
    71

squarer   42 天前

淘宝搜 公交卡改装全套工具 ,送溶解液的,也就 20 来块钱包邮,把自己的公交卡拆了,改装贴到你手机套,那么第二点就可以忽略了

有没有支持 1PB 以上月流量的美国服务器?

视频网站,流量需求大。 目前能找到的*大支持 1PB。 有没有美国哪家服务器支持 1PB 以上的月流量的?

• 2017-10-10 16:21:47 +08:00
lsylsy2 1
lsylsy2 2017-10-10 01:17:16 +08:00
普通网站带宽利用率 50%左右
1PB 月流量=提供的带宽 24 小时跑满大约是 2PB
这大概需要 6Gbit 的带宽
这个级别一般直接拉光纤,按带宽算钱了……
lsylsy2 2
lsylsy2 2017-10-10 01:17:49 +08:00
另外这个量,你真的准备单机?
lsylsy2 3
lsylsy2 2017-10-10 01:24:19 +08:00
翻了一下 lz 的历史主题,emmmm 我还是撤了比较好。
我听说过的是买很多台便宜的分散存储,然后奇怪的网站用户对速度容忍能力也相对比较高
Showfom 4
Showfom 2017-10-10 01:31:18 +08:00 via iPhone
看你要质量好的还是质量差的带宽

目前市场成本价的话也可以做到 1000 到 1 万 美元的价格,质量肯定不一样
lsylsy2 5
lsylsy2 2017-10-10 01:35:32 +08:00
@Showfom 每 G 流量 1 美分已经算好的了吗,果然大用户的时间我不懂……
Showfom 6
Showfom 2017-10-10 01:38:02 +08:00
@lsylsy2 楼主的需求不可能按流量算,只会给他按带宽来算
dzxx36gyy 7
dzxx36gyy 2017-10-10 01:43:47 +08:00 via Android
fdc 的 10g 口?(虽然据说容易跑不满
fatebe 8
fatebe 2017-10-10 01:51:25 +08:00
@dzxx36gyy
fdcservers $ 999 的 UNMETERED 实际是多少 PB ?
dzxx36gyy 9
dzxx36gyy 2017-10-10 01:57:35 +08:00 via Android
@fatebe 这个你可以咨询下官方,他家客服有中文的,直接问吧
deadblock 10
deadblock 2017-10-10 07:26:01 +08:00 via Android ❤️ 2
楼主你特娘的快贴地址啊,广告打的差不多了,该收网了啊

nyfwan123 11
nyfwan123 2017-10-10 10:20:12 +08:00 via Android ❤️ 1
楼主和 1,2,3 楼的联合广告是我在 v 站看到的*好的软广,没有之一。
neighbads 12
neighbads 2017-10-10 16:21:47 +08:00
![未命名.png]( https://i.loli.net/2017/10/10/59dc82f73785d.png)

蓝桥杯 2013年第四届真题 剪格子

蓝桥杯 2013年第四届真题 剪格子

问题描述
如下图所示,3 x 3 的格子中填写了一些整数。

+–*–+–+
|10* 1|52|
+–****–+
|20|30* 1|
*******–+
| 1| 2| 3|
+–+–+–+

我们沿着图中的星号线剪开,得到两个部分,每个部分的数字和都是60。

本题的要求就是请你编程判定:对给定的m x n 的格子中的整数,是否可以分割为两个部分,使得这两个区域的数字和相等。

如果存在多种解答,请输出包含左上角格子的那个区域包含的格子的*小数目。

如果无法分割,则输出 0。

输入格式
程序先读入两个整数 m n 用空格分割 (m,n<10)。

表示表格的宽度和高度。

接下来是n行,每行m个正整数,用空格分开。每个整数不大于10000。

输出格式
输出一个整数,表示在所有解中,包含左上角的分割区可能包含的*小的格子数目。

样例输入1
3 3
10 1 52
20 30 1
1 2 3

样例输出1
3

样例输入2
4 3
1 1 1 1
1 30 80 2
1 1 1 100

样例输出2
10

解决:使用DFS算法搜索所有可能的划分
首先根据输入求得格子总值的半数half_sum,题目要求我们将所有格子划分为两个区域,每个区域的总值为half_sum。

定义dfs前进的四个方向,其横纵坐标分别用x_ori,y_ori表示。定义数组 visit 记录每个格子是否已被访问。

从[0,0]位置开始深度优先搜索。

深度优先搜索部分:

利用格子横纵坐标进行DFS。每次遍历上下左右四个方向,朝可以前进的方向迈进一步。
DFS过程中记录当前区域的格子总值total,若total>half_sum,则该划分失败,回溯;否则若total==half_sum,则说明得到一个有效划分。此时分为两种情况:
如果count=True,即正在划分*个区域(包含[0,0]的区域),则需要继续DFS划分第二个区域;
如果count=False,即正在划分第二个区域。若两个区域的格子总个数==m*n,说明找到了一个成功的划分,成功次数+1。
如果成功次数==0,则打印0,否则打印[0,0]格子所在区域的*小格子数。
n,m = map(int, input().split())
matrix = []
visit = [[True] * n for _ in range(m)]
total_sum = 0
for i in range(m):
l = [int(i) for i in input().split()]
total_sum += sum(l)
matrix.append(l)
half_sum = int(total_sum/2) # 格子总值的一半

x_ori = [1, 0, -1, 0] # 下 右 上 左
y_ori = [0, 1, 0, -1]

success = 0 # 记录成功次数
min_blocks = m*n # 记录*个格子所在区域的*少格子数

# 深度优先搜索,
# x,y表示当前搜索到的格子所在横纵坐标
# total表示当前搜索格子总值
# count=True表示需要记录区域格子数,为了计算*个格子所在区域的*少格子数。因此count=True也可以用来表示当前正在寻找*个区域还是第二个区域
# counter表示*个格子所在区域的格子数(只有count=True时需要计数)
# total_blocks用于记录两个区域的格子总数是否为m*n
def dfs(x, y, total, counter, total_blocks,count = True):
if total > half_sum: # 若当前区域的格子总值大于half_num则返回
return
if total == half_sum: # 找到一个区域
if count: # count=True表示正在寻找[0,0]格子所在区域,即*个区域,需要继续寻找下一个区域
#print(‘Find first 60!’)
for i in range(m): # 遍历寻找下一个起始点
for j in range(n):
if visit[i][j]:
dfs(i, j, matrix[i][j], counter, total_blocks+1, False) # count=False表明开始寻找下一个区域
elif total_blocks == m*n: # count=False,且total_blocks=m*n,说明找到了满足题目要求的两个区域
#print(‘Find second 60!’)
global success, min_blocks
success += 1
if min_blocks > counter: # 更新区域*小格子数
min_blocks = counter
return

for i in range(4): # 四个方向
x_new = x + x_ori[i]
y_new = y + y_ori[i]
if x_new < 0 or y_new<0 or x_new>=m or y_new>=n:
continue
if visit[x_new][y_new]:
visit[x_new][y_new] = False
if count:
dfs(x_new, y_new, total+matrix[x_new][y_new], counter+1, total_blocks+1, count)
else:
dfs(x_new, y_new, total+matrix[x_new][y_new], counter, total_blocks+1, count)
visit[x_new][y_new] = True

# 从[0,0]开始dfs
visit[0][0] = False
dfs(0, 0, matrix[0][0], 1, 1,True)
if success:
print(min_blocks)
else:
print(0)

K均值聚类

K均值聚类

# -*- coding=utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt

# 从sklearn中直接生成聚类数据
from sklearn.datasets import make_blobs
#100个样本点,6个中心点(即聚6个类)
x, y = make_blobs( n_samples=100, centers=6, random_state=1234, cluster_std=0.6 )
# print(x) 100*2的矩阵,每一行就是一个样本点
# print(y) y可以不管
plt.figure(figsize=(6,6))
plt.scatter(x[:,0], x[:,1], c=y)
plt.show()

from scipy.spatial.distance import cdist

class K_Means(object):
# 初始化,参数 n_clusters(K)、迭代次数max_iter、初始质心 centroids
def __init__(self, n_clusters=5, max_iter=300, centroids=[]):
self.n_clusters = n_clusters
self.max_iter = max_iter
self.centroids = np.array(centroids, dtype=np.float)

# 训练模型方法,k-means聚类过程,传入原始数据就是x
def fit(self, data):
# 假如没有指定初始质心,就随机选取data中的点作为初始质心
if (self.centroids.shape == (0,)):
# 从data中随机生成0到data行数的6个整数,作为索引值
self.centroids = data[np.random.randint(0, data.shape[0], self.n_clusters), :]

# 开始迭代
for i in range(self.max_iter):
# 1. 计算距离矩阵,得到的是一个100*6的矩阵
distances = cdist(data, self.centroids)#每一行代表每个样本点到所有质心的距离

# 2. 对距离按有近到远排序,选取*近的质心点的类别,作为当前点的分类
c_ind = np.argmin(distances, axis=1)#取完后变成100*1的矩阵,代表每行中的*小值,c_ind就代表*小值的下标(就是类别)

# 3. 对每一类数据进行均值计算,更新质心点坐标
for i in range(self.n_clusters):
# 排除掉没有出现在c_ind里的类别
if i in c_ind:
# 选出所有类别是i的点,取data里面坐标的均值,更新第i个质心
self.centroids[i] = np.mean(data[c_ind == i], axis=0)

# 实现预测方法
def predict(self, samples):
# 跟上面一样,先计算距离矩阵,然后选取距离*近的那个质心的类别
distances = cdist(samples, self.centroids)
c_ind = np.argmin(distances, axis=1)

return c_ind

def plotKMeans(x, y, centroids, subplot, title):
# 分配子图,121表示1行2列的子图中的*个
plt.subplot(subplot)
plt.scatter(x[:,0], x[:,1], c=’r’)
# 画出质心点
plt.scatter(centroids[:,0], centroids[:,1], c=np.array(range(5)), s=100)
plt.title(title)

kmeans = K_Means(max_iter=300, centroids=np.array([[2,1],[2,2],[2,3],[2,4],[2,5]]))

plt.figure(figsize=(16, 6))
plotKMeans( x, y, kmeans.centroids, 121, ‘Initial State’ )

# 开始聚类
kmeans.fit(x)

plotKMeans( x, y, kmeans.centroids, 122, ‘Final State’ )

# 预测新数据点的类别
x_new = np.array([[0,0],[10,7]])
y_pred = kmeans.predict(x_new)

print(kmeans.centroids)
print(y_pred)

plt.scatter(x_new[:,0], x_new[:,1], s=100, c=’black’)

# 五行数据就是五个样本点,四列就是4个质心
# dist = np.array([[121,221,32,43], *个点分别到4个质心的距离
# [121,1,12,23], 第二个点分别到4个质心的距离
# [65,21,2,43], 第三个点分别到4个质心的距离
# [1,221,32,43], 第四个点分别到4个质心的距离
# [21,11,22,3],]) 第五个点分别到4个质心的距离
# c_ind = np.argmin( dist, axis=1 )
# print(c_ind) [2,1,2,0,3] 每个点的分类
# x_new=x[0:5]
# print(x_new)
# print(c_ind==2)
# print(x_new[c_ind==2])
# np.mean(x_new[c_ind==2], axis=0)

Python闭包的两个案例

Python闭包的两个案例

闭包的概念
闭包又称闭包函数或者闭合函数,其实和前面讲的嵌套函数类似,不同之处在于,闭包中外部函数返回的不是一个具体的值,而是一个函数。一般情况下,返回的函数会赋值给一个变量,这个变量可以在后面被继续执行调用。

案例一:游戏中的角色移动:闭包在实际开发中的作用 原文
在某种情况下,我们并不方便使用全局变量,所以灵活的使用闭包可以实现替代全局变量。

例如以下的游戏开发中,我们需要将游戏中角色的移动位置保护起来,不希望被其他函数轻易可以修改到,所以我们选择使用闭包操作,参考代码及注释如下:

origin = (0, 0) # 原点
legal_x = [-100, 100] # x轴的移动范围
legal_y = [-100, 100] # y轴的移动范围

def create(pos_x=0, pos_y=0):
# 初始化位于原点为主
def moving(direction, step):
# direction参数设置方向,1为向右(向上),-1为向左(向下),0为不移动
# step参数设置移动的距离
nonlocal pos_x, pos_y
new_x = pos_x + direction[0] * step
new_y = pos_y + direction[1] * step
# 检查移动后是否超出x轴边界
if new_x < legal_x[0]:
pos_x = legal_x[0] – (new_x – legal_x[0])
elif new_x > legal_x[1]:
pos_x = legal_x[1] – (new_x – legal_x[1])
else:
pos_x = new_x
# 检查移动后是否超出y轴边界
if new_y < legal_y[0]:
pos_y = legal_y[0] – (new_y – legal_y[0])
elif new_y > legal_y[1]:
pos_y = legal_y[1] – (new_y – legal_y[1])
else:
pos_y = new_y
return pos_x, pos_y
return moving

move = create(0, 0)
print(‘向右移动10步后,位置是:’, move([1, 0], 10))
print(‘向上移动130步后,位置是:’, move([0, 1], 130))
print(‘向左移动10步后,位置是:’, move([-1, 0], 10))

运行结果为:

向右移动10步后,位置是: (10, 0)
向上移动130步后,位置是: (10, 70)
向左移动10步后,位置是: (0, 70)

实际效果是相当于封装了一个对象move,并定义其起始点坐标,需要移动时可以调用内嵌函数moving。

案例二:计算一个数的n次幂 原文
#闭包函数,其中 exponent 称为自由变量
def nth_power(exponent):
def exponent_of(base):
return base ** exponent
return exponent_of # 返回值是 exponent_of 函数
square = nth_power(2) # 计算一个数的平方
cube = nth_power(3) # 计算一个数的立方

print(square(2)) # 计算 2 的平方
print(cube(2)) # 计算 2 的立方

运行结果为:

在上面程序中,外部函数 nth_power() 的返回值是函数 exponent_of(),而不是一个具体的数值。

需要注意的是,在执行完 square = nth_power(2) 和 cube = nth_power(3) 后,外部函数 nth_power() 的参数 exponent 会和内部函数 exponent_of 一起赋值给 square 和 cube,这样在之后调用 square(2) 或者 cube(2) 时,程序就能顺利地输出结果,而不会报错说参数 exponent 没有定义。