1. 字符串最后一个单词的长度

题目1

计算字符串最后一个单词的长度,单词以空格隔开,字符串长度小于5000。(注:字符串末尾不以空格为结尾)

思路

1. 输入“多个单词组成的字符串,并以空格分割”

2. 如何对最后一个单词进行定位?

len() 不仅可以求单个单词的长度,还可以求列表里面的元素(单词)的长度,进而做到对最后一个单词的定位。

解答

str = input()  
list = str.split(' ') # 以空格分割字符串并将结果存入列表list
n = len(list) - 1  # 获取列表list最后一个元素的索引
print(len(list[n]))

tips:

1.split() 函数返回的是列表(list)类型,而不是数组(array)类型。默认以空白(空格、换行等)为分隔符。

2. 列表(list是一个动态数组,可以包含不同类型的元素,并且大小是可变的。

数组(通常array创建)主要用于存储相同类型的元素(如整数、浮点数等),并且其大小在创建后是固定的。

扩展

https://zhuanlan.zhihu.com/p/629416216 【Python】实例10:文本词频统计



题目2

将一句话的单词进行倒置,标点不倒置。比如 I like beijing. 经过函数后变为:beijing. like I

思路

1. 别迷惑“标点不倒置”,正常split(' ')下来,标点跟在单词后面(无空格),就算一个元素。

2. split()分割字符串里的单词,存储为一个列表后,反转操作有两个常用方法。主要区分在是否改变原列表。

解答

方法一:直接用函数

str =input()
list = str.split(' ')
list.reverse() # 如果交换变量,打印出现None。因为函数reverse会直接在原列表上修改。
print(list)  
print(' '.join(list)) # 如果直接打印list,结果是列表形式,需要.join()输出

tips:

1. 使用reverse()函数时,改变的是原列表。

2. 题目要求打印出来是的格式,不是列表,所以用空格去join() 进行输出。

方法二:用切片[::-1]

str = input()
list = str.split()
new = list[::-1] # 不split会将单词里面的字母都转置
print(' '.join(new)) # 同样join将列表输出


题目3

读入一个字符串str,输出字符串str中的连续最长的数字串。

示例 abcd12345ed125ss123456789 ,输出必须 123456789 (数字串)

思路

1. 看清题目,以下是不完善的尝试记录:

a. 非求最长字符串的长度

str = input() # 最长字符串的长度
list = str.split(' ')
ls=[]
for i in list:
    len(i)
    ls.append(len(i))
print(max(ls))

b. 假设已经分开,求最长的字符串。

words = ['abc', '12345', '123', 'abcdefj']

# 初始化2个变量:一个用于存储最长字符串的长度,另外一个存储最长字符串
max_length = 0
longest_word = ''  # 定义初始的字符串的方法

# 如果当前字符串的长度大于已知的最长长度
for word in words:
    if len(word) > max_length:
        # 更新最长长度和最长字符串
        max_length = len(word)
        longest_word = word
        
print(longest_word)

2. 问题:怎么把字母和数字分开?怎么做到取出的是数字串?最后怎么融合?
.isalpha() 
检查字符串中的所有字符是否都是字母(包括大小写),且字符串中至少含一个字符。Python 3 里中文字符也被视为字母字符,返回True/False。

.isalnum() 检查字符串中的所有字符是否都是字母(包括大小写)或数字,且字符串中所有的字符都是字母或数字,且字符串至少含一个字符,返回True/False。

.isdigit() 检查字符串中所有字符是否都是数字,返回True/False。但在处理包含负号、千位分隔符不够用。

def split_number_and_non_number(s):
    result = [] # 注意result和current_word的不同
    current_word = ''  # 用于累积当前的数字串,有清空操作
    preceding_is_number = False
    longest_word = ''

    for char in s:
        if char.isdigit():
            if not preceding_is_number:
                # 如果前一个字符不是数字,并且结果不是空的,则添加空格
                if result and not result[-1].isdigit():
                    result.append(' ')
                preceding_is_number = True # 设置标志变量为True
            current_word += char  # 累积当前数字

            # 更新最长数字串
            if len(current_word) > len(longest_word): # 因为是数字,也可以直接比大小
                longest_word = current_word
        else:
            if preceding_is_number:
                # 如果前一个字符是数字,则添加当前数字字符串和空格到结果中
                result.append(current_word)
                result.append(' ')
                preceding_is_number = False
                current_word = ''  # 重置当前数字字符串 本来为12345
            result.append(char)

            # 如果字符串以数字结尾,确保将其添加到结果中
    if preceding_is_number:
        result.append(current_word)

    return ''.join(result), longest_word


# 示例输入
input_string = input() # 有负号就不行了
# 调用函数并打印结果
output_string, longest_word = split_number_and_non_number(input_string)
print(output_string)  # 输出: bc.d. 12345 .ed 125 e
print(longest_word) 

将代码合并,做到将非数字的字符串和数字字符串且分开输出,并在循环的第一个大条件里面,直接对累积出来的 current_word 与 longest_word 的长度,进行比较判断(即先将数字和非数字字符串分开,在数字部分直接判断谁最长)。

缺点是数字是一个一个进行比较的,而不是一串一串进行的。修改后,会遗漏最后一个数字串。需要补充上。

def split_number_and_non_number(s):
    result = [] # 注意result和current_word的不同
    current_word = ''  # 用于累积当前的数字串,有清空操作
    preceding_is_number = False
    longest_word = ''

    for char in s:
        if char.isdigit():
            if not preceding_is_number:
                # 如果前一个字符不是数字,并且结果不是空的,则添加空格
                if result and not result[-1].isdigit():
                    result.append(' ')
                preceding_is_number = True # 设置标志变量为True
            current_word += char  # 累积当前数字

        else:
            if preceding_is_number:
                # 如果前一个字符是数字
                # 则 1.添加当前数字字符串和空格到结果中 2.对数字串进行长短比较
                result.append(current_word)
                result.append(' ') #1
                #2 更新最长数字串
                if len(current_word) > len(longest_word): 
                    longest_word = current_word

                preceding_is_number = False
                # 重置当前数字字符串
                current_word = ''
            result.append(char)

            # 如果字符串以数字结尾,确保将其添加到结果中
    if preceding_is_number:
        result.append(current_word)
            # 循环后才有最后一个数字串,但比较是在循环里面做的,这里补一次
        if len(current_word) > len(longest_word):  
            longest_word = current_word

    return ''.join(result), longest_word

# 示例输入
input_string = input() # 负号、浮点不行
output_string, longest_word = split_number_and_non_number(input_string)
print(output_string)
print(longest_word)

测试一些例子:bcd.12345.ed125e88 输出 bcd. 12345 .ed 125 e 88 但无法对负号进行操作。

解答

正则表达式

import re, bisect
w = re.findall(r'\d+', input())
n = list(map(int, w))
print(max(n))

另外一个,只拿数字串,其他整体分割的结果不需要管。

def long_num(str):
    max_list = []
    for i in range(len(str)):
        new_list = []
        for j in range(i+1,len(str)):
            if str[j].isdigit():
                new_list.append(str[j])
            else:
                break
        if len(max_list) < len(new_list):
            max_list = new_list
    return ''.join(max_list)
str = input()
print(long_num(str))

  • 6
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值