鱼C论坛

 找回密码
 立即注册
查看: 4959|回复: 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 | 显示全部楼层
  1. def fun(str1):
  2.     char = str1[:1]
  3.     count = 1
  4.     str2 = ''
  5.     for each in str1[1:]:
  6.         if each == char:
  7.             count += 1
  8.         else:
  9.             str2 += f'{char}{count}'
  10.             char = each
  11.             count = 1
  12.     str2 += f'{char}{count}'
  13.     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 编辑
  1. from itertools import groupby
  2. def f286(x):
  3.     t= ''.join([a+str(len(list(b))) for a,b in groupby(x)])
  4.     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 | 显示全部楼层
  1. def f286(strA):
  2.     n = len(strA)
  3.     res = []
  4.     i = 0
  5.     x = 1
  6.     while i < n-1:
  7.         if strA[i] == strA[i+1]:
  8.             x +=1
  9.         else:
  10.             res.append(strA[i])
  11.             res.append(str(x))
  12.             x = 1
  13.         i += 1
  14.     res.append(strA[i])
  15.     res.append(str(x))
  16.     re = ''.join(res)
  17.     if n <= len(re):
  18.         return strA
  19.     else:
  20.         return re
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

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


还可以输入  空字符串??


  1. def f286(strA):
  2.     n = len(strA)
  3.     res = []
  4.     i = 0
  5.     x = 1
  6.     if n == 0:
  7.         return strA
  8.     while i < n-1:
  9.         if strA[i] == strA[i+1]:
  10.             x +=1
  11.         else:
  12.             res.append(strA[i])
  13.             res.append(str(x))
  14.             x = 1
  15.         i += 1
  16.     res.append(strA[i])
  17.     res.append(str(x))
  18.     re = ''.join(res)
  19.     if n <= len(re):
  20.         return strA
  21.     else:
  22.         return re
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2019-12-8 17:16:56 | 显示全部楼层
  1. def solve(str1):
  2.     result = ''
  3.     course1 = 0
  4.     l1 = len(str1)
  5.     temp = 1
  6.     while course1<l1:
  7.         if course1 == l1-1:
  8.             result += str1[course1] + str(temp)
  9.         else:
  10.             if str1[course1] != str1[course1+1]:
  11.                 result += str1[course1] + str(temp)
  12.                 temp = 0
  13.             temp += 1
  14.         course1 += 1
  15.     if len(result) >= l1:
  16.         return str1
  17.     else:
  18.         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 编辑

我来康康时间怎样,有没有出错数据
  1. def solve(give:str)->str:
  2.     res = ''
  3.     num = 0
  4.     for each in give:
  5.         if res:
  6.             if each == res[-1]:
  7.                 num += 1
  8.             else:
  9.                 res += str(num)
  10.                 num = 1
  11.                 res += each
  12.         else:
  13.             res += each
  14.             num = 1
  15.     res += str(num)
  16.     #print('调试',res)
  17.     return give if len(res) >= len(give) else res

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

复制代码



评分

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

查看全部评分

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

使用道具 举报

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

  2. def my_fun(s):
  3.     s=s.lower()
  4.     result=re.sub(r'([a-z])(\1*)',lambda i:i.group(1)+str(len(i.group())),s)
  5.     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 | 显示全部楼层
  1. def solve(s):
  2.     if not s:
  3.         return ''
  4.     res = [s[0], '1']
  5.     for i in range(1, len(s)):
  6.         if s[i] == s[i-1]:
  7.             res[-1] = str(int(res[-1])+1)
  8.         else:
  9.             res.extend((s[i], '1'))
  10.     ans = ''.join(res)
  11.     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 == x[i+1]) :
                number +=1
            else:
                temp = temp +x+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 | 显示全部楼层
  1. import  re
  2. # 也许正则的替换有点慢.
  3. def kao(s):
  4.     if not s:
  5.         return s
  6.     stt=''
  7.     for i in list(re.finditer(r'(\w)(\1*)',s.lower())):
  8.         st = i.group()
  9.         stt+=st[0]+ str(len(st))
  10.     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 | 显示全部楼层
  1. def func286(string_given):
  2.     if len(string_given) == 0:
  3.         return string_given

  4.     p1 = 0
  5.     p2 = 0
  6.     new_string = ''
  7.     counter_char = 0
  8.     while True:
  9.         if p2 >= len(string_given):
  10.             new_string += f'{string_given[p1]}{counter_char}'
  11.             break
  12.         while p2 < len(string_given):
  13.             if string_given[p1] == string_given[p2]:
  14.                 counter_char += 1
  15.                 p2 += 1
  16.             else:
  17.                 new_string += f'{string_given[p1]}{counter_char}'
  18.                 counter_char = 0
  19.                 p1 = p2
  20.                 break
  21.     #print(new_string)
  22.     #print(string_given)
  23.     if len(new_string) < len(string_given):
  24.         return new_string
  25.     else:
  26.         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 编辑
  1. def solve(s):
  2.     if s == '':
  3.         result = ''
  4.     else:
  5.         list1 = []
  6.         str2 = ''
  7.         for i in s:
  8.             list1.append(i)
  9.         n = len(list1)
  10.         num = 0
  11.         item = list1[0]
  12.         for i in range(n):
  13.             if list1[i] == item:
  14.                 num += 1
  15.             else:
  16.                 str2 += item + str(num)
  17.                 num = 0
  18.                 item = list1[i]
  19.                 num += 1
  20.         str2 += item + str(num)
  21.         if len(str2) >= len(s):
  22.             result = s
  23.         else:
  24.             result = str2
  25.     return result

  26. if __name__ == '__main__':
  27.     print('自测1:输入:str = "aabcccccaaa",输出:"%s"' % solve('aabcccccaaa'))
  28.     print('自测2:输入:str = "aabbcc",输出:"%s"' % solve('aabbcc'))
  29.     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 编辑
  1. def function(String:str):
  2.     length = len(String)
  3.     if length < 3: return String
  4.     one = String[:1]
  5.     index = 0
  6.     s = ""
  7.     while True:
  8.         num = 0
  9.         while one == String[index]:
  10.             num += 1
  11.             index += 1
  12.             if index == length:
  13.                 s += f"{one}{num}"
  14.                 return String if len(s) >= length else s
  15.         s += f"{one}{num}"
  16.         one = String[index]
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2019-12-8 21:28:21 | 显示全部楼层
  1. def fun286(s:str):
  2.     start_num=0
  3.     return_str=''
  4.     for i in range(1,len(s)):
  5.         if s[i-1]!=s[i]:
  6.             return_str+=s[i-1]+f'{i-start_num}'
  7.             start_num=i
  8.     return_str+=s[-1]+f'{len(s)-start_num}'
  9.     if len(return_str)<len(s): return return_str
  10.     else: return s
复制代码

评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-26 20:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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