找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 3904|回复: 6

[求助] 网易2018校招题目

3

主题

10

帖子

10

积分

贫民

积分
10
Charis 发表于 2017-10-27 21:39:16 | 显示全部楼层 |阅读模式
题目描述:一个由小写字母组成的字符串可以看成一些同一字母的最大碎片组成的。例如,"aaabbaaac"是由下面碎片组成的:'aaa','bb','c'。牛牛现在给定一个字符串,请你帮助计算这个字符串的所有碎片的平均长度是多少。
输入描述:输入包括一个字符串s,字符串s的长度length(1 ≤ length ≤ 50),s只含小写字母('a'-'z')输出描述:输出一个整数,表示所有碎片的平均长度,四舍五入保留两位小数。如样例所示: s = "aaabbaaac"所有碎片的平均长度 = (3 + 2 + 3 + 1) / 4 = 2.25输入例子1:aaabbaaac输出例子1:
2.25
我编写的程序:
data_in=input()
total=len(data_in)
def get_number(x):
    if len(x)==0:
        return 0
    if len(x)==1:
        return 1
    for i in range(len(x)):
        if x!=x[0] or i==len(x)-1:
            return get_number(x[i:])+1
number=get_number(data_in)
print(number)
if number!=0:
    result=total/number
else:
    result=0
print("%.2f" % result)

结果显示通过率只有30%,手动在电脑上测试数据,发现当输入为“aabb”时,number为3(正确应该为2),求大神告知一下这个程序哪里错了,抓狂了。
回复

使用道具 举报

3

主题

10

帖子

10

积分

贫民

积分
10
Charis  楼主| 发表于 2017-10-27 22:31:19 | 显示全部楼层
有大神看见的话希望能给一个回复,谢谢
回复 支持 反对

使用道具 举报

3

主题

278

帖子

278

积分

侠客

积分
278

热心会员

uitb 发表于 2017-10-28 13:12:35 | 显示全部楼层
本帖最后由 uitb 于 2017-10-28 13:14 编辑

    for i in range(len(x)):
        if x!=x[0] or i==len(x)-1:
            return get_number(x[i:])+1
这个就比较奇怪了哈, x!=x[0] 这个条件应该是一直满足的,因为经过你前面的两个if,这的x应该至少有两个长度,显然x!=x[0] 绝对成立,if语句跟后面的or就都是废的了
然后就是执行递归,递归的话里传入的是x[i:],在上面的循环中第一次,i的值是0,i=0,x[i:] = x[0:] = x也就是说你应该是又把x传入了这个函数,执行的过程跟上层调用一模一样,按理说应该会导致死循环或递归深度报错,你居然能够运行成功?
回复 支持 反对

使用道具 举报

0

主题

1

帖子

1

积分

贫民

积分
1
V2012 发表于 2017-10-28 23:26:19 | 显示全部楼层
input_str = input()
length = len(input_str)
isBreak = False

#字符串从第二个开始比较,count等于1
count = 1
suipNum = 0


def dealwhith():
    global suipNum
    suipNum += 1

for offset in range(1,length):
    if (input_str[offset - 1] == input_str[offset]):
        count += 1
        if(offset == length-1):
            dealwhith()
        continue
    else:
        dealwhith()
        count = 1
        if(offset == length-1):
            isBreak = True

#最后一个元素判断是否是与上一个元素相同
if(isBreak):
    dealwhith()

if suipNum:
    ave = length/suipNum
    ave = '%.2f' % ave
    print (ave)
回复 支持 反对

使用道具 举报

0

主题

8

帖子

8

积分

贫民

积分
8
东虫下草 发表于 2017-10-31 17:01:17 | 显示全部楼层
本帖最后由 东虫下草 于 2017-11-2 11:49 编辑

定义一个计数变量,判断相邻的字母是否相同,如果相同,则+1,如果不同则append到列表里,并重置计数变量

  1. s = input('请输入一串英文字母')
  2. lenS = []
  3. count = 1
  4. for i in range(len(s)):
  5.     if i + 1 != len(s):
  6.         if s[i + 1] != s:
  7.             lenS.append(count)
  8.             count= 1
  9.         if s[i + 1] == s:
  10.             count += 1
  11.     else:
  12.         lenS.append(count)
  13. print(sum(lenS)/(len(lenS)))
复制代码

回复 支持 反对

使用道具 举报

0

主题

2

帖子

2

积分

贫民

积分
2
z774379121 发表于 2017-11-1 16:35:54 | 显示全部楼层
s = 'aaabbaaac'
list_1 = []
def func(a):
    if s[a]!=s[a-1]:
        return a+1
for i in range(len(s)):
    list_1.append(func(i))
k = (list(filter(lambda x: type(x)==int, list_1)))
if len(s)==1:
    print(1)
else:
    print(round((len(s)/len(k)),2))

刚学python 做这个题学会了round函数 不知道是不是换版本的问题,今天刚用3 return a+1 那里不满足条件就返回None还要再加一步去掉None
回复 支持 反对

使用道具 举报

1419

主题

1891

帖子

291

积分

侠客

积分
291

最佳新人热心会员默默耕耘

whydo1 发表于 2017-11-1 20:22:41 | 显示全部楼层
  1. import re

  2. s = 'aaabbaaac'
  3. 小写字母列表=[chr(x) for x in range(97,123)]
  4. 字符碎片列表=[]
  5. for 字母 in 小写字母列表:
  6.     pp=eval("'"+字母+"{1,}'")
  7.     匹配到的碎片列表=re.findall(pp,s)
  8.     字符碎片列表.extend(匹配到的碎片列表)
  9. 字符碎片长度列表=[len(x) for x in 字符碎片列表]
  10. 结果=sum(字符碎片长度列表)/len(字符碎片长度列表)
  11. print(结果)
复制代码
python3.4.4, win10
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表