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

2023-11-18

前言

本文主要用于个人学习记录,虽然入行已久,但是没有经历过刷题的淬炼总是不完美的,因此主要用于记录刷题中的点点滴滴。
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 <stdio.h> //printf, fgets, stdin
#include <string.h> //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 <string.h>
#include <stdio.h>

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 <stdio.h>
#include <stdlib.h>
#include <string.h>

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 <stdio.h>
#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
本人后续持续更新,麻烦各位记得关注下!比心!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • FLASH位宽为8、16、32时,CPU与外设之间地址线的连接方法

    原文地址 http www eefocus com E5 8D 83 E9 87 8C E7 9F A5 E9 B9 B0 blog 10 03 186914 04945 html FLASH连接CPU时 根据不同的数据宽度 比如16位的N
  • java BigDecimal保留两位小数

    对于一些精准的数字 如涉及到金额时我们一般会使用BigDecimal类型来保存和处理 在处理保留小数位数时 如果通过DecimalFormat表达式需要注意下 1 通过DecimalFormat保留两位小数 通过上图可以看到 在补位时 如果
  • 文件上传之IIS6.0解析漏洞

    文章目录 1 判断iis版本 2 使用目录解析漏洞 2 1 写asp一句话木马 2 2 bp抓包 2 3 修改上传路径 2 4 实用工具连接 2 5 get shell 3 使用文件解析漏洞 3 1 写一句话马 3 2 上传 3 3 抓包改
  • mmyolo框架实现在VOC数据集上复现Yolov6教程(详细)

    写在开头 最近学习mmyolo的框架 想着它能将所有配置都写在一个config文件里 只需要改配置文件就可以改动模型 感觉挺方便的 就想着Yolov6用mmyolo框架来实现 但mmyolo并没有提供v6的voc实现配置 v5是有的 看下图
  • RocketMQ的消息优先级

    有些场景 需要应用程序处理几种类型的消息 不同消息的优先级不同 RocketMQ是个先入先出的队列 不支持消息级别或者Topic级别的优先级 业务中简单的优先级需求 可以通过间接的方式解决 下面列举三种优先级相关需求的具体处理方法 第一种
  • Linux环境下的jdk安装(大数据环境)

    jdk安装 创建软件存放目录 上传文件 我使用的MobaXterm 创建解压目录 解压jdk压缩包 修改软件名 使他简洁易操作 配置环境变量 让配置文件生效 查看jdk版本信息 将HP01 的usr文件夹整体拷贝到HP02 HP03目录下
  • 如何使用 FreeRTOS中的xQueueCreate,xQueueSend,xQueueReceive

    信号量Semaphore和互斥量mutex 只能用于进程间的同步 并不能传递更多的数据 在freertos 提供了messageQ 用来在实现进程同步的同时 传递数据 进程间通信 或者ISR和TASK之间通信 如果没有messageQ 则只
  • Object&Objects

    Object 概念 Object 是类层次结构的根 每个类都可以将 Object 作为超类 所有类都直接或者间接的继承自该类 换句话说 该类所具备的方法 所有类都会有一份 toString 作用 以良好的格式 更方便的展示对象中的属性值 重
  • c++ Json库读取和写入json文件

    include json include writer h include json include reader h include
  • Fabric中的“账户”体系

    本文的联盟链是以Fabric为例 本文中transaction翻译成事务 而非交易 联盟链相对于公链 最大的不同在于 联盟链上的数据不是对所有人都公开的 只有联盟内的成员才可以访问 写入链上数据 第二个重要的区别 联盟链不发币 所以联盟链里
  • WSL安装与使用(Ubuntu22.04)

    文章目录 概要 WSL介绍 WSL安装 安装环境 安装方式一 命令行安装 不推荐 可能出现奇怪的问题 安装方式二 通过控制面板安装 WSL 安装Ubuntu22 04 通过Microsoft Store Ubuntu更换镜像源 进入Ubun
  • I2C接口与SPI和UART接口的区别

    一 SPI I2C UART通信速率比较 SPI gt I2C gt UART 1 同步通信 gt 异步通信 2 同步通信时必须有一根时钟线连接传输的两端 3 都是串行通信方式 并行通信用于内部存储间的通信 如flash 4 适合传输的距离
  • python爬虫(爬取唯品会)

    import json import requests from bs4 import BeautifulSoup from selenium import webdriver from time import sleep class Vi
  • 磁盘设备类型获取函数

    将该部分内容保存到 cpp文件中可直接编译运行 用于辨别驱动器的类型 define MEDIA INFO SIZE sizeof GET MEDIA TYPES 15 sizeof DEVICE MEDIA INFO define IOCT
  • JAVA获取上一年的日期_java获取日期,前一年,前一月,前一周

    SimpleDateFormat format new SimpleDateFormat yyyy MM dd HH mm ss Calendar calendar Calendar getInstance 现在日期 String now
  • vue区分单双击事件

    基本思路 利用setTimeout gt 200 使单击事件在200s后再执行 如果200s内触发了双击事件 则使用clearTimeout this timeOut 清除该计时器 取消单击事件的执行 执行双击事件 代码如下 定义变量 da
  • 每日一练——Python基础(七)

    请设计一个好友管理系统 每个功能都对应一个序号 用户可根据提示 请输入您的选项 选择序号执行相应的操作 包括 1 添加好友 用户根据提示 请输入要添加的好友 输入要添加好友的姓名 添加后会提示 好友添加成功 2 删除好友 用户根据提示 请输
  • Accurate Scale Estimation for Robust Visual Tracking 学习笔记:

    Accurate Scale Estimation for Robust Visual Tracking DSST学习笔记 尺度变化是跟踪中比较基础和常见的问题 目标变小 跟踪器就会吸收大量没有用的背景信息 目标过大 跟踪器就会丢失很多特征
  • HDFS的block和切片(split)的联系和区别

    lt 1 gt 联系 HDFS的block和切片 split 的大小相等 lt 2 gt 区别 1 HDFS存储数据在数据节点上 block是数据节点储存数据的一个个单位 2 split是把block切分而成的虚拟定义 3 split是Ma
  • 华为机试-HJ1 字符串最后一个单词的长度-C语言、python

    刷题第一步 熟悉输入输出及基本套路 前言 题目描述 C语言 题解1 fgets 题解2 scanf 题解3 gets python 题解1 题解2 参考解析 方法一 使用split 直接返回长度 方法二 逐位遍历找空格 前言 本文主要用于个