技术笔试刷题笔记-4

1. 字符串运用-密码截取

  • 题目描述
    Catcher 是MCA国的情报员,他工作时发现敌国会用一些对称的密码进行通信,比如像这些ABBA,ABA,A,123321,但是他们有时会在开始或结束时加入一些无关的字符以防止别国破解。比如进行下列变化 ABBA->12ABBA,ABA->ABAKK,123321->51233214 。因为截获的串太长了,而且存在多种可能的情况(abaaab可看作是aba,或baaab的加密形式),Cathcer的工作量实在是太大了,他只能向电脑高手求助,你能帮Catcher找出最长的有效密码串吗?

    (注意:记得加上while处理多个测试用例)

  • 代码:

def _palindrome(string, window):
    result_slice = []
    if window % 2 == 0:
        for i in range(0, len(string)-window+1):
            slice_ = string[i:i+window]
            mid = int( window/2 )
            if slice_[0:mid] == slice_[mid::][::-1]:
                result_slice.append(slice_)
    elif window % 2 == 1:
        for i in range(0, len(string)-window+1):
            slice_ = string[i:i+window]
            mid = int( (window-1)/2 )
            if slice_[0:mid] == slice_[mid+1::][::-1]:
                result_slice.append(slice_)
    return result_slice

def palindrome(string, window):
    result_slice = []
    for i in range(0, len(string)-window+1):
        slice_ = string[i:i+window]

        if slice_ == slice_[::-1]:
            result_slice.append(slice_)

    return result_slice

#string = "12ABBA"
def max_palindrome(string):
    max_window = 0
    for i in range(len(string)):
        if i - max_window >=1 and string[i-max_window-1 : i+1] == string[i-max_window-1:i+1][::-1]:
            max_window += 2
        elif i - max_window >= 0 and string[i-max_window : i+1] == string[i-max_window : i+1][::-1]:
            max_window += 1
    return max_window
#max_palindrome(string)

string = str(input())
"""
ls_result = []
for window in range(2,len(string)+1):
    ls_result += palindrome(string, window)

    print(max([len(s) for s in ls_result]))
"""
print(max_palindrome(string), sep="")

2. 查找组成一个偶数最接近的两个素数

  • 题目描述
    任意一个偶数(大于2)都可以由2个素数组成,组成偶数的2个素数有很多种情况,本题目要求输出组成指定偶数的两个素数差值最小的素数对

  • 代码:


def is_prime(n):
    for i in range(2,n):
        if n%i == 0:
            return False
    return True

def prime_pair(num):
    i,j = int(num/2), num-int(num/2)
    while i>=2:
        if is_prime(i) and is_prime(j):
            return i,j
        else:
            i -= 1
            j = num-i
    return None,None

while True:
    try:
        num = int(input())
        result = prime_pair(num)
        print(result[0])
        print(result[1])
        pass
    except:
        break

3. 求小球落地5次后所经历的路程和第5次反弹的高度

  • 题目描述
    假设一个球从任意高度自由落下,每次落地后反跳回原高度的一半; 再落下, 求它在第5次落地时,共经历多少米?第5次反弹多高?

    最后的误差判断是小数点6位

  • 代码:

while True:
    try:
        height = int(input())

        total_distance = 0
        for i in range(5):
            # 落地
            total_distance += height
            # 跳起来
            height /= 2
            if i == 4:
                print(total_distance)
                print(height)
            total_distance += height
    except:
        break

4. 判断两个IP是否属于同一子网

  • 题目描述
子网掩码是用来判断任意两台计算机的IP地址是否属于同一子网络的根据。
子网掩码与IP地址结构相同,是32位二进制数,其中网络号部分全为“1”和主机号部分全为“0”。利用子网掩码可以判断两台主机是否中同一子网中。若两台主机的IP地址分别与它们的子网掩码相“与”后的结果相同,则说明这两台主机在同一子网中。

示例:
I P 地址  192.168.0.1
子网掩码  255.255.255.0

转化为二进制进行运算:

I P 地址 11010000.10101000.00000000.00000001
子网掩码 11111111.11111111.11111111.00000000

AND运算
     11000000.10101000.00000000.00000000

转化为十进制后为:
     192.168.0.0

 

I P 地址  192.168.0.254
子网掩码  255.255.255.0


转化为二进制进行运算:

I P 地址 11010000.10101000.00000000.11111110
子网掩码 11111111.11111111.11111111.00000000

AND运算
     11000000.10101000.00000000.00000000

转化为十进制后为:
     192.168.0.0

通过以上对两台计算机IP地址与子网掩码的AND运算后,我们可以看到它运算结果是一样的。均为192.168.0.0,所以这二台计算机可视为是同一子网络。

/* 
* 功能: 判断两台计算机IP地址是同一子网络。 
* 输入参数:    String Mask: 子网掩码,格式:“255.255.255.0”; 
*               String ip1: 计算机1的IP地址,格式:“192.168.0.254”;
*               String ip2: 计算机2的IP地址,格式:“192.168.0.1”;
*               

* 返回值:      0:IP1与IP2属于同一子网络;     1:IP地址或子网掩码格式非法;    2:IP1与IP2不属于同一子网络
*/ 
public int checkNetSegment(String mask, String ip1, String ip2) 
{     
    /*在这里实现功能*/
    return 0;
}


  • 代码:
def check_effect(string):
    ls = string.split(".")
    ls = [True if 0 <= eval(s) <= 255 else False for s in ls]
    return all(ls)

def eval_ip(ips):
    # ips = ip2
    ls = ips.split(".")
    ls = [eval(ip) for ip in ls]
    return ls

while True:
    try:
        # mask = "255.255.255.0"
        # ip1 = "192.168.0.254"
        # ip2 = "192.168.0.1"
        mask = str(input())
        ip1 = str(input())
        ip2 = str(input())
        
        

        if not all([check_effect(ip) for ip in [mask, ip1, ip2]]):
            print(1)
            continue




        mask_e = eval_ip(mask)
        ip1_e = eval_ip(ip1)
        ip2_e = eval_ip(ip2)

        subnet_1 = [ mask & ip for mask,ip in zip(mask_e, ip1_e)]
        subnet_2 = [ mask & ip for mask,ip in zip(mask_e, ip2_e)]

        print(0) if subnet_1 == subnet_2 else print(2)
        pass
    except:
        break

5. 求最小公倍数

  • 题目描述
    正整数A和正整数B 的最小公倍数是指 能被A和B整除的最小的正整数值,设计一个算法,求输入A和B的最小公倍数。

  • 代码:

while True:
    try:

        string = str(input())
        ls = string.split(" ")
        n1 = eval(ls[0])
        n2 = eval(ls[1])
        
        init = n1 if n1>n2 else n2
        n_out = init

        while True:
            if n_out % n1 == 0:
                print(n_out)
                break
            else:
                n_out += init
        pass
    except:
        break
        

6. 放苹果

  • 题目描述
题目描述

把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。


输入

每个用例包含二个整数M和N。0<=m<=10,1<=n<=10。


样例输入

7 3


样例输出

8


/**

* 计算放苹果方法数目


* 输入值非法时返回-1

* 1 <= m,n <= 10

* @param m 苹果数目

* @param n 盘子数目数

* @return 放置方法总数

*

*/

public static int count(int m, int n)

  • 代码:
def f(m,n):
    if m<0 or n<0:
        return 0
    elif m == 1 or n==1:
        return 1
    else:
        return f(m, n-1) + f(m-n, n)
    


while True:
    try:
        m,n = map(eval, str(input()).split(" "))
        print(f(m, n))
        pass
    except:
        break
        

7. 201301 JAVA题目0-1级

  • 题目描述
    编写一个函数,传入一个int型数组,返回该数组能否分成两组,使得两组中各元素加起来的和相等,并且,所有5的倍数必须在其中一个组中,所有3的倍数在另一个组中(不包括5的倍数),能满足以上条件,返回true;不满足时返回false。

  • 代码:

while True:
    try:
        ls_path = []
        n = int(input())
        choices = str(input()).strip(" ").split(" ")
        choices = [eval(x) for x in choices]

        ls_3 = []
        ls_5 = []

        for i in choices:
            if i%3 ==0 and i != 0:
                ls_3.append(i)
            elif i%5 ==0 and i != 0:
                ls_5.append(i)
        [choices.remove(i) for i in ls_3]
        [choices.remove(i) for i in ls_5]


        d = sum(ls_5) - sum(ls_3)
        sum_all = sum(choices)
        sum_find  = (d + sum_all)/2
        sum_find2  = (-d + sum_all)/2


        choices.sort()
        #flag = 0
        ls_result = []
        for start in range(len(choices)+1):
        #    if flag == 1:
        #        break
            for end in range( start+1, len(choices)+1):
                if sum(choices[start:end]) == sum_find or sum(choices[start:end]) == sum_find2:
        #            print("true")
        #            flag =1 
        #            break
                    ls_result.append((start, end) )
                else:
                    continue
        #if flag == "0":
        #    print("false")
        if len(ls_result)>0:
            print("true")
        else:
            print("false")


    except:
        break                 

8. 统计每个月兔子的总数

  • 题目描述
有一只兔子,从出生后第3个月起每个月都生一只兔子,小兔子长到第三个月后每个月又生一只兔子,假如兔子都不死,问每个月的兔子总数为多少?


/**
* 统计出兔子总数。
*
* @param monthCount 第几个月
* @return 兔子总数
*/
public static int getTotalCount(int monthCount)
{
return 0;
}

本题有多组数据,请使用while (cin>>)读取


  • 代码:
while True:
    
    try:
        n = int(input())
        ls = [0]
        for month in range(0, n+1):
            ls_add = []
            [ls_add.append(month) if month - rabit >=3 else None for rabit in ls]
            ls += ls_add
        print(len(ls))
        
        
        pass
    except:
        break
        

你可能感兴趣的:(leetdoce)