鱼C论坛

 找回密码
 立即注册
查看: 7029|回复: 48

Python:每日一题 286

[复制链接]
发表于 2019-12-8 15:55:37 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 zltzlt 于 2019-12-8 16:03 编辑

今天的题目:


设计一个函数,通过给重复字符计数来进行基本的字符串压缩。例如,字符串 'wxxxyyyzzzz' 可压缩为 'w1x3y3z4'。
如果压缩后的字符串长度大于等于原字符串长度,则返回原字符串

说明:字符串仅包括 a ~ z 的字母。

示例 1:

输入:str = "aabcccccaaa"
输出:"a2b1c5a3"
示例 2:

输入:str = "aabbcc"
输出:"aabbcc"


欢迎大家一起答题!

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-12-8 16:21:37 | 显示全部楼层
def fun(str1):
    char = str1[:1]
    count = 1
    str2 = ''
    for each in str1[1:]:
        if each == char:
            count += 1
        else:
            str2 += f'{char}{count}'
            char = each
            count = 1
    str2 += f'{char}{count}'
    return str2 if len(str2) < len(str1) else str1

评分

参与人数 1荣誉 +3 鱼币 +3 贡献 +1 收起 理由
zltzlt + 3 + 3 + 1 983 ms

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2019-12-8 16:22:56 | 显示全部楼层
本帖最后由 塔利班 于 2019-12-8 16:27 编辑
from itertools import groupby
def f286(x):
    t= ''.join([a+str(len(list(b))) for a,b in groupby(x)])
    return x if len(t)>=len(x) else t

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
zltzlt + 1 + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-8 16:25:32 | 显示全部楼层

解答错误

输入:"a"
输出:"a1"
预期结果:"a"
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-8 16:26:32 | 显示全部楼层
zltzlt 发表于 2019-12-8 16:25
解答错误

输入:"a"

改了

评分

参与人数 1荣誉 +2 鱼币 +2 贡献 +2 收起 理由
zltzlt + 2 + 2 + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-8 16:29:56 | 显示全部楼层

你没看清楚题

如果压缩后的字符串长度大于等于原字符串长度,则返回原字符串。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-8 16:36:28 | 显示全部楼层

913 ms

没想到还可以用 itertools
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-8 16:44:14 | 显示全部楼层
def f286(strA):
    n = len(strA)
    res = []
    i = 0
    x = 1
    while i < n-1:
        if strA[i] == strA[i+1]:
            x +=1
        else:
            res.append(strA[i])
            res.append(str(x))
            x = 1
        i += 1
    res.append(strA[i])
    res.append(str(x))
    re = ''.join(res)
    if n <= len(re):
        return strA
    else:
        return re
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-12-8 16:45:19 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-8 16:56:00 | 显示全部楼层
本帖最后由 零0℃度 于 2019-12-8 16:58 编辑


还可以输入  空字符串??

def f286(strA):
    n = len(strA)
    res = []
    i = 0
    x = 1
    if n == 0:
        return strA
    while i < n-1:
        if strA[i] == strA[i+1]:
            x +=1
        else:
            res.append(strA[i])
            res.append(str(x))
            x = 1
        i += 1
    res.append(strA[i])
    res.append(str(x))
    re = ''.join(res)
    if n <= len(re):
        return strA
    else:
        return re

评分

参与人数 1荣誉 +3 鱼币 +3 贡献 +2 收起 理由
zltzlt + 3 + 3 + 2 834 ms

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-8 17:16:56 | 显示全部楼层
def solve(str1):
    result = ''
    course1 = 0
    l1 = len(str1)
    temp = 1
    while course1<l1:
        if course1 == l1-1:
            result += str1[course1] + str(temp)
        else:
            if str1[course1] != str1[course1+1]:
                result += str1[course1] + str(temp)
                temp = 0
            temp += 1
        course1 += 1
    if len(result) >= l1:
        return str1
    else:
        return result

评分

参与人数 1荣誉 +2 鱼币 +2 贡献 +2 收起 理由
zltzlt + 2 + 2 + 2 924 ms

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-8 17:24:59 | 显示全部楼层
本帖最后由 阴阳神万物主 于 2019-12-8 17:35 编辑

我来康康时间怎样,有没有出错数据
def solve(give:str)->str:
    res = ''
    num = 0
    for each in give:
        if res:
            if each == res[-1]:
                num += 1
            else:
                res += str(num)
                num = 1
                res += each
        else:
            res += each
            num = 1
    res += str(num)
    #print('调试',res)
    return give if len(res) >= len(give) else res

if __name__ == '__main__':
    print('示例1 输出:',solve('aabcccccaaa'))
    print('示例2 输出:',solve('aabbcc'))
    print('别人错的 输出:',solve(''))
    print('自测 输出:',solve('我我我我我总觉觉觉觉得有中文也能好好好好好好使'))
    print('自测 输出:',solve('哪----------怕,,,,,有————标点符号也样'))
    print('玩玩圆周率 输出:',solve('   .4555555555222222555     88888888877777777733   888866'))


评分

参与人数 1荣誉 +2 鱼币 +2 贡献 +2 收起 理由
zltzlt + 2 + 2 + 2 910 ms

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-8 17:30:00 | 显示全部楼层
import re

def my_fun(s):
    s=s.lower()
    result=re.sub(r'([a-z])(\1*)',lambda i:i.group(1)+str(len(i.group())),s)
    return result if len(result)<len(s) else s

评分

参与人数 1荣誉 +2 鱼币 +2 贡献 +2 收起 理由
zltzlt + 2 + 2 + 2 1270 ms

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-8 17:45:23 | 显示全部楼层
def solve(s):
    if not s:
        return ''
    res = [s[0], '1']
    for i in range(1, len(s)):
        if s[i] == s[i-1]:
            res[-1] = str(int(res[-1])+1)
        else:
            res.extend((s[i], '1'))
    ans = ''.join(res)
    return ans if len(ans) < len(s) else s

评分

参与人数 1荣誉 +2 鱼币 +2 贡献 +2 收起 理由
zltzlt + 2 + 2 + 2 887 ms

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-8 18:03:09 | 显示全部楼层
本帖最后由 asukafai 于 2019-12-10 21:47 编辑

def fun(x):
#已修改
    temp = ''
    length = len(x)
    number = 1
    if length < 2:
        temp = x
    else:
        for i in range(0, length-1):
            if (x[i] == x[i+1]) :
                number +=1
            else:
                temp = temp +x[i]+str(number)
                number =1
        if x [-1] == x[-2]:
            temp = temp+x[-1]+str(number)
        else:
            temp = temp + x[-1] +'1'
            
    return x if len(temp)>=length else temp

x = input('请输入字符串:')
result = fun(x)
print('压缩字符串结果为:',result)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-8 18:33:42 | 显示全部楼层
import  re
# 也许正则的替换有点慢.
def kao(s):
    if not s:
        return s
    stt=''
    for i in list(re.finditer(r'(\w)(\1*)',s.lower())):
        st = i.group()
        stt+=st[0]+ str(len(st))
    return stt if len(stt)<len(s)else s

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
zltzlt + 1 + 1 1039 ms

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-8 18:58:44 | 显示全部楼层
def func286(string_given):
    if len(string_given) == 0:
        return string_given

    p1 = 0
    p2 = 0
    new_string = ''
    counter_char = 0
    while True:
        if p2 >= len(string_given):
            new_string += f'{string_given[p1]}{counter_char}'
            break
        while p2 < len(string_given):
            if string_given[p1] == string_given[p2]:
                counter_char += 1
                p2 += 1
            else:
                new_string += f'{string_given[p1]}{counter_char}'
                counter_char = 0
                p1 = p2
                break
    #print(new_string)
    #print(string_given)
    if len(new_string) < len(string_given):
        return new_string
    else:
        return string_given

评分

参与人数 1荣誉 +2 鱼币 +2 贡献 +2 收起 理由
zltzlt + 2 + 2 + 2 1008 ms

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-8 19:29:59 | 显示全部楼层
本帖最后由 闲愚 于 2019-12-10 21:30 编辑
def solve(s):
    if s == '':
        result = ''
    else:
        list1 = []
        str2 = ''
        for i in s:
            list1.append(i)
        n = len(list1)
        num = 0
        item = list1[0]
        for i in range(n):
            if list1[i] == item:
                num += 1
            else:
                str2 += item + str(num)
                num = 0
                item = list1[i]
                num += 1
        str2 += item + str(num)
        if len(str2) >= len(s):
            result = s
        else:
            result = str2
    return result

if __name__ == '__main__':
    print('自测1:输入:str = "aabcccccaaa",输出:"%s"' % solve('aabcccccaaa'))
    print('自测2:输入:str = "aabbcc",输出:"%s"' % solve('aabbcc'))
    print('自测3:输入:str = "",输出:"%s"' % solve(''))

评分

参与人数 1荣誉 +1 鱼币 +1 贡献 +1 收起 理由
zltzlt + 1 + 1 + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-8 20:54:23 | 显示全部楼层
本帖最后由 Stubborn 于 2019-12-8 20:55 编辑
def function(String:str):
    length = len(String)
    if length < 3: return String
    one = String[:1]
    index = 0
    s = ""
    while True:
        num = 0
        while one == String[index]:
            num += 1
            index += 1
            if index == length:
                s += f"{one}{num}"
                return String if len(s) >= length else s
        s += f"{one}{num}"
        one = String[index]

评分

参与人数 1荣誉 +2 鱼币 +2 贡献 +2 收起 理由
zltzlt + 2 + 2 + 2

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-12-8 21:28:21 | 显示全部楼层
def fun286(s:str):
    start_num=0
    return_str=''
    for i in range(1,len(s)):
        if s[i-1]!=s[i]:
            return_str+=s[i-1]+f'{i-start_num}'
            start_num=i
    return_str+=s[-1]+f'{len(s)-start_num}'
    if len(return_str)<len(s): return return_str
    else: return s

评分

参与人数 1荣誉 +1 鱼币 +1 贡献 +1 收起 理由
zltzlt + 1 + 1 + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-24 08:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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