本文主要用于个人学习记录,虽然入行已久,但是没有经历过刷题的淬炼总是不完美的,因此主要用于记录刷题中的点点滴滴。
C语言
熟悉输入函数scanf、gets、fgets的使用;
字符相关函数strrchr、strchr的使用;
python
熟悉intput()、input.str()、strip()、split() 使用;
本人后续持续更新,麻烦各位记得关注下!比心!
计算字符串最后一个单词的长度,单词以空格隔开,字符串长度小于5000。
(注:字符串末尾不以空格为结尾)
输入描述:
输入一行,代表要计算的字符串,非空,长度小于5000。
输出描述:
输出一个整数,表示输入字符串最后一个单词的长度
思路:
使用strrchr找到最右边的第一个空格,然后将指针移动到首字母。
注意:
获取输入时,gets有溢出风险,建议使用fgets(char s, int n, FILE stream);
使用fgets时,如果字符串长度小于n-1且结尾有换行符,则会获取换行符,并在换行符之后填充’\0’,所以计算长度时需要判断是否需要减去换行符**
#include //printf, fgets, stdin
#include //strrchr, strchr, strlen
int main(void)
{
char str[5000] = {0};
int length = 0;
char *p = NULL;
/* 使用fgets从标准输入(stdin)获取一行 */
fgets(str, sizeof(str), stdin);
/* 使用strrchr找到最右边的第一个空格 */
p = strrchr(str, ' ');
if (p)
p = p + 1; //指向首字母
else
p = str; //只有一个单词
/* 使用strchr查找是否存在换行符 */
if (strchr(p, '\n'))
length = strlen(p) - 1;
else
length = strlen(p);
printf("%d\n", length);
return 0;
}
解题思路:
1、声明一个字符数组word,并初始化;
2、使用scanf 方式输入字符串,并将其放入字符数组中;
特别注意scanf输入时的 “%[^\n]” 操作,[^字符A] : 表明只有在遇到字符A时,输入才会截止
同样scanf 还有"%[a-z]" “%[0-9]” 操作,[字符/字符范围]:表明只有在字符或字符范围内,输入才有效
3、逆序进行 字符比较,当其字符与空格字符’ ’ 相同时,退出for 循环;
这里又有一个 新手和 老鸟 都会忽视的地方,单引号、双引号、不带引号 分别代表什么意思?
单引号 ‘a’ ‘A’ 用于指代字符a A , 一般用法if(word[i] == ‘a’) 判断是否为字符a ,
双引号”a" “A” 则用于指代字符串、常量, 一般用法 const char * = “abdcd”;
不带引号 a A 则用来指代 变量, 一般用法 a = 100; int i = a;
#include
#include
int main () {
char word[5000] = {0};
int length = 0;
scanf("%[^\n]", word);
for (int i = strlen(word)-1; i >= 0; i--) {
if (word[i] == ' ') {
break;
}
length++;
}
printf("%d\n", length);
return 0;
}
类似
#include "stdio.h"
#include "string.h"
int main()
{
char a[5000];
int num;
while(scanf("%s",a)!=EOF)
num=strlen(a);
printf("%d\n",num);
}
#include
#include
#include
int main(){
char a[5000] = {0};
char *p;
gets(a);
p = strrchr(a,' ');
if(p!=NULL){
printf("%d\n",strlen(p+1));
}else{
printf("%d\n",strlen(a));
}
return 0;
}
类似
#include
#define MAX_LEN 5000
int main(void) {
char a[MAX_LEN];
int num = 0;
int len ,i;
gets(a);
len = strlen(a)-1;
for (i=len; i>=0; i--) {
if (a[i] == ' ') {
break;
}
else {
num++;
}
}
printf("%d\n", num);
return 0;
}
input_str = input()
word_list = input.str().strip().split()
last_word = word_list[-1]
last_word_len = len(last_word)
print(last_word_len)
去除字符串首尾空格,设置指针,从数组的末尾向数组头部移动,直至遇到空格或者遇到数组首位元素,此时指针移动距离即最后一个单词的长度
input_str = input().strip()
dis = 0
for i in range(len(input_str)-1, -1, -1):
if input_str[i] == ' ':
break
dis += 1
print(dis)
调用分割方法
我们可以直接调用split()函数分割含有空格的字符串
得到的列表最后一个元素即子字符串
最终返回其长度即可
import sys
### 读取输入数据部分 ###
for line in sys.stdin:
a = line.split()
### 读取输入数据部分 ###
print(len(a[-1])) # 打印分割后最后一个子字符串的长度即可
复杂度分析
时间复杂度:O(n)O(n)O(n),只要打印出最后的长度即可,但是调用split()函数复杂度为O(n)O(n)O(n)
空间复杂度:O(1)O(1)O(1),未引入额外的空间
遍历
我们从后往前进行遍历
标记找到第一个空格字符就停止循环
最终通过索引差来获得结果
import sys
### 读取输入数据部分 ###
s = ""
for line in sys.stdin:
s = line
### 读取输入数据部分 ###
pos = -1 # 标记一个待寻找的空白字符位置
for i in range(len(s) -1, -1, -1): # 对输入字符串进行倒序遍历
if s[i] == ' ': # 如果遇到空格则标记空格位置,并退出循环
pos = i
break
print(len(s) - pos - 2) # 打印最终的最后一个字符串的长度
复杂度分析
时间复杂度:O(n)O(n)O(n),遍历的时间代价为O(n)O(n)O(n)
空间复杂度:O(1)O(1)O(1),未引入额外的空间占用
用于学习总结,以上部分内容来自牛客网https://www.nowcoder.com/exam/oj/ta?tpId=37
本人后续持续更新,麻烦各位记得关注下!比心!