上级领导的检查已经结束了,我非常感谢各位同事对我的一种配合,我今天能够作为领导,能够来到这里,也非常感谢各位的对我照顾,让我看到了你们最优秀的一面,也让我看到了你们平时的工作环境,我也希望你们能够继续努力,能够完成我们的任务与工作,加油吧!
01、毫不动摇的勇气
好的领导,首先要对自己和自己的职业有着足够的认识,知道什么是对的、什么是错的,从而产生毫不动摇的勇气。
试想一下,如果一个领导对自己和工作都没有足够的自信和坚定的勇气,那么他难免会在工作上畏畏缩缩,甚至会在某些决定和方案上变来变去,很可能会导致失败。
如此一个连最基本的坚持都没有的人,当然不可能领导他人持续进步,自然不会有人真心愿意追随他。
02、愿负全责
很多领导都有推卸责任的习惯,一旦工作中出现了问题,第一时间就会把锅甩给下属,自己却置身事外。这样的领导,没有任何一个下属是愿意追随的,他的领导地位必然岌岌可危。
好的领导必须甘愿为下属犯的错误而承担责任,因为你的部下本就是你的责任,部下的失败就是你领导能力的失败。你可以训斥下属甚至责罚下属,但是责任你必须要帮着承担,这样才是一个好领导的担当,下属才会心甘情愿的臣服和追随。
03、强烈的正义感
在职场中谈“正义感”好像很可笑很幼稚,但这却是领导必须具备的特质,也是一个人是否优秀的标志所在。
无领导面试通常将候选人放在一个模拟团队环境中进行考核,无领导面试题型和答题技巧如下:
1. 小组讨论题
这种题目通常要求候选人与其他考生进行小组讨论,发表意见、提出建议以及解决问题。在小组讨论中,候选人应该积极参与,并且尽可能地为团队做出贡献。同时,候选人还需要注意措辞和态度,避免与其他考生产生不必要的争执。
2. 情景模拟题
情境模拟题是一种真实的情境重现。在此类题型中,候选人需要扮演特定的角色,通过模拟情境来展示自己的能力和素质。在回答问题时,候选人应该保持冷静,清晰地表达自己的观点,尽可能合理和深入地分析情境和问题,并有效地解决问题或面对挑战。
3. 个人陈述题
个人陈述问题要求候选人谈论自己的职业规划、经验、技能和成就等方面。在回答此类问题时,候选人应该简明扼要地描述自己的背景和优势,并且向招聘者展示自己的价值,强调与公司文化和岗位职责的匹配性,以期能够得到录用。
无领导面试的答题技巧包括:
1. 合理安排时间:无领导面试通常有多种题型,考生需要根据不同题型的时间限制,合理安排时间,避免时间不够导致中途被迫截止。
2. 保持积极态度:心态积极是成功的关键,在面试中,考生需要保持良好的心态,坦诚自信地回答问题,避免过于紧张或消极。
3. 多听少说:在小组讨论中,考生需要遵循“多听少说”的原则,主动倾听其他人的意见,表现出良好的沟通和协作能力。
4. 表达清晰:无论是个人陈述还是情景模拟题,考生都需要用清晰明确的语言表达自己的思想和观点,避免表达不清或含糊不清。
又到安利Python的时间, 最终代码不超过30行(优化前),加上优化也不过40行。
第一步. 构造Trie(用dict登记结点信息和维持子结点集合):
-- 思路:对词典中的每个单词,逐词逐字母拓展Trie,单词完结处的结点用None标识。
def make_trie(words):
trie = {}
for word in words:
t = trie
for c in word:
if c not in t: t[c] = {}
t = t[c]
t[None] = None
return trie
第二步. 容错查找(容错数为tol):
-- 思路:实质上是对Trie的深度优先搜索,每一步加深时就消耗目标词的一个字母。当搜索到达某个结点时,分为不消耗容错数和消耗容错数的情形,继续搜索直到目标词为空。搜索过程中,用path记录搜索路径,该路径即为一个词典中存在的词,作为纠错的参考。
-- 最终结果即为诸多搜索停止位置的结点路径的并集。
def check_fuzzy(trie, word, path='', tol=1):
if word == '':
return {path} if None in trie else set()
else:
p0 = set()
if word[0] in trie:
p0 = check_fuzzy(trie[word[0]], word[1:], path+word[0], tol)
p1 = set()
if tol > 0:
for k in trie:
if k is not None and k != word[0]:
p1.update(check_fuzzy(trie[k], word[1:], path+k, tol-1))
return p0 | p1
简单测试代码 ------
构造Trie:
words = ['hello', 'hela', 'dome']
t = make_trie(words)
In [11]: t
Out[11]:
{'d': {'o': {'m': {'e': {'$': {}}}}},
'h': {'e': {'l': {'a': {'$': {}}, 'l': {'o': {'$': {}}}}}}}
容错查找:
In [50]: check_fuzzy(t, 'hellu', tol=0)
Out[50]: {}
In [51]: check_fuzzy(t, 'hellu', tol=1)
Out[51]: {'hello'}
In [52]: check_fuzzy(t, 'healu', tol=1)
Out[52]: {}
In [53]: check_fuzzy(t, 'healu', tol=2)
Out[53]: {'hello'}
似乎靠谱~
---------------------------分--割--线--------------------------------------
以上是基于Trie的approach,另外的approach可以参看@黄振童鞋推荐Peter Norvig即P神的How to Write a Spelling Corrector
虽然我已有意无意模仿P神的代码风格,但每次看到P神的源码还是立马跪...
话说word[1:]这种表达方式其实是有渊源的,相信有的童鞋对(cdr word)早已烂熟于心...(呵呵
------------------------分-----割-----线-----二--------------------------------------
回归正题.....有童鞋说可不可以增加新的容错条件,比如增删字母,我大致对v2方法作了点拓展,得到下面的v3版本。
拓展的关键在于递归的终止,即每一次递归调用必须对参数进行有效缩减,要么是参数word,要么是参数tol~
def check_fuzzy(trie, word, path='', tol=1):
if tol < 0:
return set()
elif word == '':
results = set()
if None in trie:
results.add(path)
# 增加词尾字母
for k in trie:
if k is not None:
results |= check_fuzzy(trie[k], '', path+k, tol-1)
return results
else:
results = set()
# 首字母匹配
if word[0] in trie:
results |= check_fuzzy(trie[word[0]], word[1:], path + word[0], tol)
# 分情形继续搜索(相当于保留待探索的回溯分支)
for k in trie:
if k is not None and k != word[0]:
# 用可能正确的字母置换首字母
results |= check_fuzzy(trie[k], word[1:], path+k, tol-1)
# 插入可能正确的字母作为首字母
results |= check_fuzzy(trie[k], word, path+k, tol-1)
# 跳过余词首字母
results |= check_fuzzy(trie, word[1:], path, tol-1)
# 交换原词头两个字母
if len(word) > 1:
results |= check_fuzzy(trie, word[1]+word[0]+word[2:], path, tol-1)
return results
好像还是没有过30行……注释不算(
本答案的算法只在追求极致简洁的表达,概括问题的大致思路。至于实际应用的话可能需要很多Adaption和Tuning,包括基于统计和学习得到一些词语校正的bias。我猜测这些拓展都可以反映到Trie的结点构造上面,比如在结点处附加一个概率值,通过这个概率值来影响搜索倾向;也可能反映到更多的搜索分支的控制参数上面,比如增加一些更有脑洞的搜索分支。(更细节的问题这里就不深入了逃
----------------------------------分-割-线-三----------------------------------------
童鞋们可能会关心时间和空间复杂度的问题,因为上述这种优(cu)雅(bao)的写法会导致产生的集合对象呈指数级增加,集合的合并操作时间也指数级增加,还使得gc不堪重负。而且,我们并不希望搜索算法一下就把所有结果枚举出来(消耗的时间亦太昂贵),有可能我们只需要搜索结果的集合中前三个结果,如果不满意再搜索三个,诸如此类...
那肿么办呢?................是时候祭出yield小魔杖了゚ ∀゚)ノ
下述版本姑且称之为lazy,看上去和v3很像(其实它俩在语义上是几乎等同的
def check_lazy(trie, word, path='', tol=1):
if tol < 0:
pass
elif word == '':
if None in trie:
yield path
# 增加词尾字母
for k in trie:
if k is not None:
yield from check_lazy(trie[k], '', path + k, tol - 1)
else:
if word[0] in trie:
# 首字母匹配成功
yield from check_lazy(trie[word[0]], word[1:], path+word[0], tol)
# 分情形继续搜索(相当于保留待探索的回溯分支)
for k in trie:
if k is not None and k != word[0]:
# 用可能正确的字母置换首字母
yield from check_lazy(trie[k], word[1:], path+k, tol-1)
# 插入可能正确的字母作为首字母
yield from check_lazy(trie[k], word, path+k, tol-1)
# 跳过余词首字母
yield from check_lazy(trie, word[1:], path, tol-1)
# 交换原词头两个字母
if len(word) > 1:
yield from check_lazy(trie, word[1]+word[0]+word[2:], path, tol-1)
不借助任何容器对象,我们近乎声明式地使用递归子序列拼接成了一个序列。
[新手注释] yield是什么意思呢?就是程序暂停在这里了,返回给你一个结果,然后当你调用next的时候,它从暂停的位置继续走,直到有下个结果然后再暂停。要理解yield,你得先理解yield... Nonono,你得先理解iter函数和next函数,然后再深入理解for循环,具体内容童鞋们可以看官方文档。而yield from x即相当于for y in x: yield y。
给刚认识yield的童鞋一个小科普,顺便回忆一下组合数C(n,m)的定义即
C(n, m) = C(n-1, m-1) + C(n-1, m)
如果我们把C视为根据n和m确定的集合,加号视为并集,利用下面这个generator我们可以懒惰地逐步获取所有组合元素:
def combinations(seq, m):
if m > len(seq):
raise ValueError('Cannot choose more than sequence has.')
elif m == 0:
yield ()
elif m == len(seq):
yield tuple(seq)
else:
for p in combinations(seq[1:], m-1):
yield (seq[0],) + p
yield from combinations(seq[1:], m)
for combi in combinations('abcde', 2):
print(combi)
可以看到,generator结构精准地反映了集合运算的特征,而且蕴含了对元素进行映射的逻辑,可读性非常强。
OK,代码到此为止。利用next函数,我们可以懒惰地获取查找结果。
In [54]: words = ['hell', 'hello', 'hela', 'helmut', 'dome']
In [55]: t = make_trie(words)
In [57]: c = check_lazy(t, 'hell')
In [58]: next(c)
Out[58]: 'hell'
In [59]: next(c)
Out[59]: 'hello'
In [60]: next(c)
Out[60]: 'hela'
话说回来,lazy的一个问题在于我们不能提前预测并剔除重复的元素。你可以采用一个小利器decorator,修饰一个generator,保证结果不重复。
from functools import wraps
def uniq(func):
@wraps(func)
def _func(*a, **kw):
seen = set()
it = func(*a, **kw)
while 1:
x = next(it)
if x not in seen:
yield x
seen.add(x)
return _func
这个url打开的文件包含常用英语词汇,可以用来测试代码:
In [10]: import urllib
In [11]: f = urllib.request.urlopen("https://raw.githubusercontent.com/eneko/data-repository/master/data/words.txt")
# 去除换行符
In [12]: t = make_trie(line.decode().strip() for line in f.readlines())
In [13]: f.close()
----------------------分-割-线-四-----------------------------
最后的最后,Python中递归是很昂贵的,但是递归的优势在于描述问题。为了追求极致性能,我们可以把递归转成迭代,把去除重复的逻辑直接代入进来,于是有了这个v4版本:
from collections import deque
def check_iter(trie, word, tol=1):
seen = set()
q = deque([(trie, word, '', tol)])
while q:
trie, word, path, tol = q.popleft()
if word == '':
if None in trie:
if path not in seen:
seen.add(path)
yield path
if tol > 0:
for k in trie:
if k is not None:
q.appendleft((trie[k], '', path+k, tol-1))
else:
if word[0] in trie:
q.appendleft((trie[word[0]], word[1:], path+word[0], tol))
if tol > 0:
for k in trie.keys():
if k is not None and k != word[0]:
q.append((trie[k], word[1:], path+k, tol-1))
q.append((trie[k], word, path+k, tol-1))
q.append((trie, word[1:], path, tol-1))
if len(word) > 1:
q.append((trie, word[1]+word[0]+word[2:], path, tol-1))
可以看到,转为迭代方式后我们仍然可以最大程度保留递归风格的程序形状,但也提供了更强的灵活性(对于递归,相当于我们只能用栈来实现这个q)。基于这种迭代程序的结构,如果你有词频数据,可以用该数据维持一个最优堆q,甚至可以是根据上下文自动调整词频的动态堆,维持高频词汇在堆顶,为词语修正节省不少性能。这里就不深入了。
【可选的一步】我们在对单词进行纠正的时候往往倾向于认为首字母是无误的,利用这个现象可以减轻不少搜索压力,花费的时间可以少数倍。
def check_head_fixed(trie, word, tol=1):
for p in check_lazy(trie[word[0]], word[1:], tol=tol):
yield word[0] + p
最终我们简单地benchmark一下:
In [18]: list(check_head_fixed(trie, 'misella', tol=2))
Out[18]:
['micellar',
'malella',
'mesilla',
'morella',
'mysell',
'micelle',
'milla',
'misally',
'mistell',
'miserly']
In [19]: %timeit list(check_head_fixed(trie, 'misella', tol=2))
1.52 ms ± 2.84 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
在Win10的i7上可以在两毫秒左右返回所有结果,可以说令人满意。
领导带队检查以身作则。在公司一般领导定期下基层检查,他们带领各专业部门,技术,生产,供应,财务,统一着装,带安全帽子,手机全部按静音,在某个细节,某个车间,逐步排查,查出隐患,毫无保留该罚款罚款,警告处分处分,写出书面材料整改,显示领导权威。
如果领导来检查工作的话,要把领导让到会议室,在会议室领导进去之前,就应该把领导的水倒好,不要当着领导的面去倒水。
这也是对招待领导的一个最基本的工作,也就是领导进来之前,你就要把茶水给领导提好让领导来了之后直接喝就行了,而不是说还要等着等着你吃完了再喝就很热了。
即然领导来检查,就说明这个单位是被领导单位相对的实体,如果说应付只能说对这次检报着抵触态度,但又不能阻止这就叫应付差事。有一句话很实际,叫全体总动员唬弄检查团。其实领导检查来必不好,他能促进单位各项工作,找出不足,还是把应付改成欢迎吧。
尊敬的各位领导、各位专家、各位同事:
大家好!我是本次项目的监理,今天很荣幸能够在这里发言。
作为监理,我一直以来都在严格监督工程进度、质量和安全等方面的执行情况。在这个过程中,我深刻认识到了监理在工程建设中的重要作用。我们不仅要确保工程质量和安全,还要积极协调各方面的利益,促进项目的顺利进行。
在本次项目中,我们遇到了一些困难和挑战。但是,在各方的共同努力下,我们成功地完成了各项任务。这得益于项目组成员的密切合作和配合,得益于各方专家的精益求精,也得益于监理的不懈努力。
在未来的工程建设中,我们还要进一步加强监理工作,提高监理质量和水平。同时,我们也要不断学习和掌握新的监理技术和方法,以适应不断发展变化的社会需求。
最后,我要感谢各位领导、专家和同事的支持和帮助。我相信,在大家的共同努力下,我们一定能够创造出更加优秀的工程建设成果!
一、目的 为切实抓好公司安全生产管理,增强领导和职工的安全意识,进一步落实安全生产主体责任制与现场管理,特制定本制度。 二、职责 公司制度的制定、检查、考核及日常管理工作,各生产部门贯彻执行等工作。 三、带班领导 带班领导是指公司法定代表人、经理、总工、生产分管负责人、专工。 四、带班安排 公司法人、公司经理、总工、生产分管负责人、专工每月带班一次。 五、领导带班职责 1、企业负责人要定期带班检查,每月检查时间不少
为领导拍照有几点要注意,第一要突出领导,一定要在c位。
第二要有突出特点,要么温暖,要么正义凌然。
第三一定要突出现场感,让人一看就知道很深入基层。