网易 算法工程师 2019/8/3

倒数排序(10分)

将1到n的所有排列按照字典排成一排。从中选出一个排列,假设他是正数第Q个排列,输出倒数第Q个排列。

例如:

1到3的所有排列是:

1 2 3

1 3 2 

2 1 3 

2 3 1 

3 1 2 

3 2 1

选出排列为 1 2 3,则Q=1, 输出倒数第Q个排列 为: 3 2 1 

思路:其实仔细观察可以发现,这个排列是对称的,1 2 3 和 3 2 1 ,对应位置相加都是4,此时n = 3; 同理我们的测试案例 3 1 5 2 4 输出应该为3 5 1 4 2也是对应位置相加为6,此时n = 5; 这样应该可以看出规律。在笔试的时候,是我们把问题想得过于复杂了!!! 果然大神就是大神!!!!

 1 #coding=utf-8
 2 import sys
 3 
 4 if __name__ == "__mian__":
 5     #具体的读取数据,输出数据的格式,请参考例题
 6     """
 7     python2 输入数据度数据的格式
 8     n = int(sys.stdin.readline().strip())           #读取输入的数字
 9     line = sys.stdin.readline().strip().split()     #读取输入的数组
10     values = list(map(int,line))
11     """
12     
13     """
14     python3 输入数据度数据的格式
15     n = int(input("please input a number:"))
16     line = input("please input a list:").split(' ')
17     values = list(int(i) for i in line)  #输入读取的是str类型,需要转换为int类型
18     """
19     
20     n = 5
21     values = [3,1,5,2,4]
22     
23     result = list()  #输出结果为一个list, 也可以 result = []
24     for v in values:
25         result.append(n+1-v)
26     # 将 int类型数据 转换为 str
27     result = map(str,result) 
28     print(' '.join(result))

 数字圆环(20分)

数组 a1, a2, ..., an  长度为n

将这个n个数字构成一个环(首尾相连),使得环中每个数字都小于与她相邻的两个数字的和(每个数字都必须使用,且使用一次)

输入:

 

t  测试用例个数

n 数字个数

数组A=a1 a2 ... an

输出:

t行,对于每组样例,若能输出“YES”,否则输出“NO”

例如:

输入

1

5

17 6 17 11 17

输出

YES

 

排序后的除了最大的那个数,其余数必然满足那个条件啊,因为只是前面的那个数就比它大了,所以只要给最大的那个数找两侧的数就可以了,两侧最大的数就是第二大第三大的数,如果这两数都不满足条件,那么必然无法排成,如果满足 那必然能排成圆环
排序后数组,除了最后一个元素,都满足  ai < (ai+1) + (ai-1) , 要想形成环,我们必须让最后一个元素满足 an < (an-1) + a0
t = 1 
# n = 5
# A = [17,6,17,11,17]
A = [1,2,4,3]
for i in range(t):
    A.sort()
    if A[-1] < A[-2] + A[0]:
        print("YES")
    else:
        print("NO")

  

 
 
 
序列交换(20分)
数组a1,a2,...an  长度为n; 对数组执行任意次交换,即对数组中的两个下标i,j (1<=i,j<=n),如果ai+aj 为奇数(说明两个数一个为奇数,一个为偶数),就可以交换ai,aj
 

操作次数不限, 求出在所有能通过若干次操作得到的数组中,输出 字典序最小的一个是什么?(字典序是啥)

 

输入

n                数组长度

a1,a2,..,an 数组,用空格分隔

保证 1<=n<=10^5; 1<=ai<=10^9

输出

数组 字典序最小的数组

思路:如果有奇偶,则直接排序;否则,直接输出

# A = [7,3,5,1]
A = [53941,38641,31526,75864,29026,12199,33522,58200,64784,31997]

result = list()
for v in A:
    result.append(v)

temp1 = [x for x in result if x%2==0]
temp2 = [x for x in result if x%2!=0]

if temp1 != [] and temp2 != []:
    result.sort()
result = [str(x) for x in result]
print(' '.join(result))

优秀的01序列(30分)

给定01序列S,序列S是优秀的01序列,定义如下:

1. 如果序列S,T是优秀的,则S+T也为优秀的, +定义为连接,即“010”+“110”=“010110”

2.若序列S,则按位取反后的序列rev(S)也是优秀的。 需要删除前导0,例如rev("1100101")="11010"

 

输入

T 数据组数

每组数组第一行为01序列S,第二行为01序列T

输出

对与每组数据,一行输出"YES",或者“NO”,表示序列T是不是优秀的

举例

1

1100

110011

输出

YES

示例2

输入

1

1000

100001111

输出

NO

解析:看不懂,

作者:NotDeep
链接:https://www.nowcoder.com/discuss/216237
来源:牛客网

我们对序列SSS不断执行rev操作,得到的一系列序列S1,S2S˙nS_{1},S_{2} \dot S_{n}S1,S2S˙n。再依次翻转每个序列的每一位,得到一系列序列T1,T2,T˙nT_{1},T_{2},\dot T_{n}T1,T2,T˙n

例如"110011"可以生成{"110011","1100","11"}与{"001100","0011","00"}

如果TTT是优秀的,当且仅当TTT是由这两组序列拼接而成,并且第一组序列中最原始的序列SSS不能接第二组序列中的序列。

可以使用dp来维护上述过程。令f[i][0/1]表示前i位是否优秀,且拼接的最后一个01串是不是初始序列SSS。按定义转移即可。

 

转载于:https://www.cnblogs.com/ivyharding/p/11296646.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值