Netty 通过Map管理用户Channel

有时候我们需要绑定用户id,让他们可以通过id与对方进行通信

通过Map实现一个简单的连接池

import io.netty.channel.socket.SocketChannel;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

public class GatewayService{
    private static Map map = new ConcurrentHashMap();

    public static void addGatewayChannel(String id, SocketChannel gateway_channel){
    map.put(id,gateway_channel);
    }

    public static Map getChannels(){
        return map;
    }

    public static SocketChannel getGatewayChannel(String id){
        return (SocketChannel)map.get(id);
    }

    public static void removeGatewayChannel(String id){
        map.remove(id);
    }
}

 

给phpstudy安装Memcached

Memcached是一款开源式的分布式缓存系统,Memcached 1.4.20为最新版本,适用于windows 64位和32位操作系统。Memcached 是性能的数据存储缓存工具,对于数据库庞大的服务器来说,使用Memcached 有效地减轻服务器的负担,提高服务的运行性能。

1.解压Memcached压缩包至拓展目录

2.安装/启动驱动即可

安装:

memcached -d install

memcached -d start

net start “Memcached Server”

卸载:

memcached -d stop

memcached -d remove

sc delete “Memcached Server”

memcached的基本设置:

-p 监听的端口

-l 连接的IP地址, 默认是本机

-d start 启动memcached服务

-d restart 重起memcached服务

-d stop|shutdown 关闭正在运行的memcached服务

-d install 安装memcached服务

-d uninstall 卸载memcached服务

-u 以的身份运行 (仅在以root运行的时候有效)

-m 最大内存使用,单位MB。默认64MB

-M 内存耗尽时返回错误,而不是删除项

-c 最大同时连接数,默认是1024

-f 块大小增长因子,默认是1.25

-n 最小分配空间,key+value+flags默认是48

-h 显示帮助

Python 实现数列求值

【问题描述】
给定数列 1, 1, 1, 3, 5, 9, 17, …,从第 4 项开始,每项都是前 3 项的和。求
第 20190324 项的最后 4 位数字。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个 4 位整数(提示:答案的千位不为 0),在提交答案时只填写这个整数,填写多余的内容将无法得分。

def slqz(n):
    if n in [1,2,3]:
        return 1
    f1,f2,f3,fn=1,1,1,0
    for i in range(4,n+1):
        fn=(f1+f2+f3)%10000
        f1=f2
        f2=f3
        f3=fn
    return fn

print(slqz(20190324))

 

Python实现 字母图形

问题描述

利用字母可以组成一些美丽的图形,下面给出了一个例子:

ABCDEFG

BABCDEF

CBABCDE

DCBABCD

EDCBABC

这是一个5行7列的图形,请找出这个图形的规律,并输出一个n行m列的图形。

输入格式
输入一行,包含两个整数n和m,分别表示你要输出的图形的行数的列数。
输出格式
输出n行,每个m个字符,为你的图形。
样例输入
5 7
样例输出
ABCDEFG
BABCDEF
CBABCDE
DCBABCD
EDCBABC
数据规模与约定
1 <= n, m <= 26。
n,m = map(int,input().split(' '))
for i in range(n):
    for k in range(i):
        if k < m:
            print(chr(65-k+i),end="")
    for j in range(m-i):
        print(chr(j+65),end="")
    print("")

 

Python实现 斐波那契数列 取余

斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3,n∈N*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从1963年起出版了以《斐波纳契数列季刊》为名的一份数学杂志,用于专门刊载这方面的研究成果。

 

问题描述

Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。

当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。

输入格式
输入包含一个整数n。
输出格式
输出一行,包含一个整数,表示Fn除以10007的余数。

说明:在本题中,答案是要求Fn除以10007的余数,因此我们只要能算出这个余数即可,而不需要先计算出Fn的准确值,再将计算的结果除以10007取余数,直接计算余数往往比先算出原数再取余简单。

样例输入
10
样例输出
55
样例输入
22
样例输出
7704
数据规模与约定
1 <= n <= 1,000,000。
def f(n):
    if n in [1,2]:
        return 1
    f1,f2,fn=1,1,0
    for i in range(3,n+1):
        fn = (f1+f2)%10007
        f1 = f2
        f2 = fn
    return fn

n = int(input())
print(f(n))

 

Python实现 找凶手 巴斯维克命案

巴斯维克命案抓住了六个嫌疑犯,他们的口供如下:
A:我不是罪犯
B:A、C中有一个是罪犯
C:A和B说了假话
D:C和F说了假话
E:其他五个人中,只有A和D说了真话
F:我是罪犯
他们中只有一半说了真话,凶手只有一个。
本题可能有多种可能性,即正确答案(找到唯一的凶手)可能有多个,但每一个可能的答案(某一个是凶手)都满足上述口供。
请编程找出可能的凶手输出。
(假设唯一的凶手是A或者D或者E,则输出结果为三行,按字母顺序依次输出)

def a():
    #我不是罪犯
    return people[0]!=1
def b():
    #A,C中有一个是罪犯
    return (people[0]==1 and people[2]==0) or (people[0]==0 and people[2]==1)
def c():
    #A和B说了假话
    return bool(1-a()) and bool(1-b())
def f():
    #我是罪犯
    return people[5]==1
def d():
    #C和F说了假话
    return bool(1-c()) and bool(1-f())
def e():
    #其他五个人中,只有A和D说了真话
    return a() and d() and bool(1-b()) and bool(1-c()) and bool(1-f())

people=[]
for i in range(6):
    count=0
    pc=""
    people.clear()
    for j in range(6):
        people.append(0)
    people[i] = 1

    if a()==True:
        count+=1
        pc+='a,'
    if b()==True:
        count+=1
        pc+='b,'
    if c()==True:
        count+=1
        pc+='c,'
    if d()==True:
        count+=1
        pc+='d,'
    if e()==True:
        count+=1
        pc+='e,'
    if f()==True:
        count+=1
        pc+='f,'
    if count==3:
        print(chr(65+i))

    #print(people)
    #print("排查%s,结果%s,排查项%s"%(str(i),str(count),str(pc)))

    

 

Python求特别数的和

样题2:特别数的和(编程大题)

【问题描述】

小明对数位中含有2、0、1、9的数字很感兴趣(不包括前导0),在1到40中这样的数包括1、2、9、10至32、39和40,共28个,他们的和是574。

请问,在 1 到 n 中,所有这样的数的和是多少?

【输入格式】

输入一行包含一个整数 n。

【输出格式】

输出一行,包含一个整数,表示满足条件的数的和。

【样例输入】

40

【样例输出】

574

while True:
    n=eval(input())
    count=0
    for i in range(1,n+1):
        for j in str(i):
            if j in ['2','0','1','9']:
                count+=i
                break
    print(count)

 

Python 实现矩形切割

样题1:矩形切割(结果填空题)

【问题描述】

小明有一些矩形的材料,他要从这些矩形材料中切割出一些正方形。

当他面对一块矩形材料时,他总是从中间切割一刀,切出一块最大的正方形,剩下一块矩形,然后再切割剩下的矩形材料,直到全部切为正方形为止。

例如,对于一块两边分别为5和3的材料(记为5×3),小明会依次切出3×3、2×2、1×1、1×1共4个正方形。

现在小明有一块矩形的材料,两边长分别是2019和324。请问小明最终会切出多少个正方形?

【答案提交】

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

说明:以上是问题描述的部分,选手做题时可以直接手算答案,即按照题目意思一步一步切割,最后得到切出的矩形个数,手算可能花费一些时间。如果选手在手算时使用除法等方式加快速度,时间可能少一些。如果选手编写程序来计算,可以减少手算中出现的失误。

本题答案为:21

while True:
    w,h=map(int,input().split(' '))
    count=0
    while True:
        if w>h:
            w-=h
            count+=1
        if w<h:
            h-=w
            count+=1
        elif w==h:
            count+=1
            w=h=0
        if w<=0 or h<=0:
            print(count)
            break
        

 

Python 实现核桃分配(求最小公倍数)

def findMax(a,b,c):
    maxNum = 0
    if(a>b):
        maxNum = a
    else:
        maxNum = b
    if(c>maxNum):
        maxNum = c
    return maxNum

while True:
    a,b,c = map(int,input().split())
    d = findMax(a,b,c)
    e=t=1
    while True:
        t = e*d
        if(t%a==t%b==t%c):
            print(t)
            break
        e+=1
小张是软件项目经理,他带领3个开发组。工期紧,今天都在加班呢。为鼓舞士气,小张打算给每个组发一袋核桃(据传言能补脑)。他的要求是:
1.  各组的核桃数量必须相同
2.  各组内必须能平分核桃(当然是不能打碎的)
3.  尽量提供满足1,2条件的最小数量(节约闹革命嘛)

输入
输入包含三个正整数a,  b,  c,表示每个组正在加班的人数,用空格分开(a,b,c< 30)
输出
输出一个正整数,表示每袋核桃的数量。

Python 实现2^k进制数

k,w=map(int,input().split())
wd,wm=divmod(w,k)
def c(m,n):
    if n>m:
        return 0
    if n<0:
        return 0
    s=1
    for i in range(n):
        s=s*(m-i)/(i+1)
    return round(s)
s0=sum([c(2**k-1,i) for i in range(2,wd+1)])
s1=sum([c(2**k-1-x0,wd) for x0 in range(1,2**wm)])
print(s0+s1)

这次代码不是我写的…不过从大佬的代码中提前接触了map、divmod、[xxxx for i in range()] 的使用,也算有收益了

 


题目描述

设r是个2^k 进制数,并满足以下条件:
(1)r至少是个2位的2^k 进制数。
(2)作为2^k 进制数,除最后一位外,r的每一位严格小于它右边相邻的那一位。
(3)将r转换为2进制数q后,则q的总位数不超过w。
在这里,正整数k(1≤k≤9)和w(k〈w≤30000)是事先给定的。

问:满足上述条件的不同的r共有多少个?
我们再从另一角度作些解释:设S是长度为w 的01字符串(即字符串S由w个“0”或“1”组成),S对应于上述条件(3)中的q。将S从右起划分为若干个长度为k 的段,每段对应一位2^k进制的数,如果S至少可分成2段,则S所对应的二进制数又可以转换为上述的2^k 进制数r。
例:设k=3,w=7。则r是个八进制数(2^3=8)。由于w=7,长度为7的01字符串按3位一段分,可分为3段(即1,3,3,左边第一段只有一个二进制位),则满足条件的八进制数有:
2位数:高位为1:6个(即12,13,14,15,16,17),高位为2:5个,…,高位为6:1个(即67)。共6+5+…+1=21个。
3位数:高位只能是1,第2位为2:5个(即123,124,125,126,127),第2位为3:4个,…,第2位为6:1个(即167)。共5+4+…+1=15个。
所以,满足要求的r共有36个。

输入

只有1行,为两个正整数,用一个空格隔开:
k w

输出

1行,是一个正整数,为所求的计算结果,即满足条件的不同的r的个数(用十进制数表示),要求最高位不得为0,各数字之间不得插入数字以外的其他字符(例如空格、换行符、逗号等)。
(提示:作为结果的正整数可能很大,但不会超过200位)

样例输入
3  7
样例输出
36