华为机试-HJ1 字符串最后一个单词的长度-C语言、python

刷题第一步,熟悉输入输出及基本套路

  • 前言
  • 题目描述
  • C语言
    • 题解1-fgets
    • 题解2-scanf
    • 题解3-gets
  • python
    • 题解1
    • 题解2
    • 参考解析
      • 方法一:使用split()直接返回长度
      • 方法二:逐位遍历找空格

前言

本文主要用于个人学习记录,虽然入行已久,但是没有经历过刷题的淬炼总是不完美的,因此主要用于记录刷题中的点点滴滴。
C语言
熟悉输入函数scanf、gets、fgets的使用;
字符相关函数strrchr、strchr的使用;
python
熟悉intput()、input.str()、strip()、split() 使用;
本人后续持续更新,麻烦各位记得关注下!比心!

题目描述

计算字符串最后一个单词的长度,单词以空格隔开,字符串长度小于5000。
(注:字符串末尾不以空格为结尾)
输入描述:
输入一行,代表要计算的字符串,非空,长度小于5000。

输出描述:
输出一个整数,表示输入字符串最后一个单词的长度

C语言

题解1-fgets

思路:
使用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;
    }

题解2-scanf

解题思路:
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);
}

题解3-gets

#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;
}

python

题解1

  1. 使用python中字符串的内置函数strip()去除字符串首尾空格
  2. 使用split()按照空格将字符串切分成单词数组
  3. 找到最后一个单词并计算其长度
input_str = input() 
word_list = input.str().strip().split() 
last_word = word_list[-1] 
last_word_len = len(last_word) 
print(last_word_len)

题解2

去除字符串首尾空格,设置指针,从数组的末尾向数组头部移动,直至遇到空格或者遇到数组首位元素,此时指针移动距离即最后一个单词的长度

  1. 去掉首尾空格
  2. 指针从数组末尾开始移动,判断
  • 若所指元素为空格则停止移动,输出指针移动距离
  • 若不为空格,则向前移动,移动距离加一
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()直接返回长度

调用分割方法
我们可以直接调用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
本人后续持续更新,麻烦各位记得关注下!比心!

你可能感兴趣的:(刷题练习-熟悉算法,c语言,算法,python)