【C++】P1765 手机


在这里插入图片描述

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳]
本文专栏: C++

文章目录

  • 💯前言
  • 💯问题描述
    • 题目内容
      • 示例:
    • 键盘布局
  • 💯我的做法
    • 思路
    • 问题与优化
    • 我的代码实现
    • 分析与问题
  • 💯老师的做法
    • 思路
    • 老师的代码实现
    • 分析
    • 优点
  • 💯对比与总结
    • 相同点
    • 不同点
  • 💯扩展
    • 1. **扩展键盘布局**:
    • 2. **空间优化**:
  • 💯小结


在这里插入图片描述


💯前言

  • 在这篇文章中,我们将分析一个关于手机键盘按键次数计算的问题。通过对比两种不同的解法——自己的解法和老师的解法,深入理解这个问题的本质,优化思路,并通过一些技术细节扩展来提升解决方案的效率和可读性。
    C++ 参考手册
    在这里插入图片描述

💯问题描述

P1765 手机
在这里插入图片描述

题目内容

题目要求我们计算在普通手机键盘上输入一个句子所需要的最少按键次数。每个数字键对应多个字母,而按下相同数字键的次数决定了字符的输出。比如,要输入字母 x,就需要按数字键 9 两次。输入空格时,按键 0 一次即可。

给定输入的句子,我们需要计算出在键盘上打出这个句子所需的按键总数。

输入格式:

  • 一行句子,仅包含英文小写字母和空格,且不超过 200 个字符。

输出格式:

  • 一行一个整数,表示按键盘的总次数。

示例:

输入:

i have a dream

输出:

23

键盘布局

题目中的手机键盘布局如下所示:

在这里插入图片描述

键盘上每个数字键下有多个字母。对于输入的每个字母,我们要计算它所需要的按键次数。空格对应数字键 0,按一次即可。

💯我的做法

我最初的做法使用了一个逐步推算字符按键次数的方法,采用了基于字符范围判断来计算按键次数。具体做法如下:

思路

  1. 通过字符的 ASCII 值来判断字母所属的数字键。
  2. 对于每个字符,按下对应的数字键次数根据字符在该数字键中的位置来决定。例如:
    • 对于字母 a, b, c,按 1 次键 2;
    • 对于字母 d, e, f,按 1 次键 3;
    • 对于字母 p, q, r, s,按 4 次键 7;
    • 空格需要按 1 次键 0。

问题与优化

我的方法中使用了条件语句来逐步判断每个字符属于哪个数字键,然后根据字母在该键中的位置来推算按键次数。然而,这种方法对于字母的映射并不直观,容易出错,尤其是在处理字母范围时,代码的可维护性较差。

我的代码实现

#include <iostream>
#include <string>
using namespace std;int main()
{string s;int count = 0;getline(cin, s);for(int i = 0; i < s.size(); i++){if(s[i] >= 'a' && s[i] <= 'o'){count += (((s[i] - 'a') % 3) + 1);}else if(s[i] >= 'p' && s[i] <= 's'){count += ((s[i] - 'o') % 5);}else if(s[i] >= 't' && s[i] <= 'v'){count += ((s[i] - 's') % 4);}else if(s[i] >= 'w' && s[i] <= 'z'){count += ((s[i] - 'v') % 5);}else{count += 1;}}cout << count << endl;return 0;
}

分析与问题

  1. 条件判断繁琐:每个字符根据其范围被分配到不同的按键次数,这种方法比较冗长且容易出错,特别是在字符范围的界定上。
  2. 维护困难:如果要扩展或修改键盘布局,修改代码的地方会很多,维护起来不方便。

💯老师的做法

老师的做法则采用了更简洁且高效的解决方案。通过定义一个数组 count 来映射每个字母到它所需的按键次数。每个字母的按键次数在数组中已经预先设定好。

思路

  1. 使用数组 count[26] 来记录每个字母的按键次数,字母的索引是通过 c - 'a' 计算的。
  2. 遍历输入的句子,对于每个字符,如果是空格,则加 1;如果是字母,则直接根据 count 数组的值进行累加。

老师的代码实现

在这里插入图片描述

#include <iostream>
#include <string>
using namespace std;int count[26] = {1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 1, 2, 3, 4}; int main()
{string s;int sum = 0;getline(cin, s);for(auto c : s){if(c == ' ') sum += 1; // 空格只需按一次0elsesum += count[c - 'a']; // 字母的按键次数}cout << sum << endl;return 0;
}

分析

  1. 简洁高效:通过数组 count 预设每个字母的按键次数,避免了多次条件判断,使得代码更加简洁。
  2. 时间复杂度 O(n):遍历字符串并通过数组索引查找按键次数,时间复杂度为 O(n),其中 n 是输入句子的长度。
  3. 可扩展性好:如果要改变按键布局,只需要修改 count 数组即可,不需要修改逻辑代码,维护起来更加方便。

优点

  • 通过数组直接映射字母到按键次数,减少了代码的复杂度。
  • 代码逻辑清晰,容易理解,并且易于扩展。

💯对比与总结

相同点

  1. 目标一致:两者的目标都是计算出输入句子的按键次数。
  2. 逐字符遍历:两者都遍历了输入的每个字符,并根据字符计算按键次数。

不同点

  1. 实现方式

    • 我的做法通过条件判断字符的范围来计算按键次数,代码较长且复杂。
    • 老师的做法通过预设数组来直接获取每个字母的按键次数,代码简洁且高效。
  2. 代码可读性与维护性

    • 我的代码虽然能完成任务,但由于存在多个条件判断,代码不易扩展和维护。
    • 老师的代码通过数组映射的方式,代码更加简洁,易于维护和修改。
  3. 执行效率

    • 两者的时间复杂度均为 O(n),但是老师的做法由于减少了条件判断,执行效率略高。

💯扩展

1. 扩展键盘布局

如果问题中要求更复杂的键盘布局(例如支持大写字母、符号等),可以通过扩展 count 数组的大小,或者使用哈希表来存储字符到按键次数的映射。

2. 空间优化

如果字符集较大,count 数组可能会变得非常庞大。可以考虑使用哈希表来存储字符到按键次数的映射,这样可以避免不必要的空间浪费。

💯小结

通过这次对比与分析,我们可以看到,尽管两种方法最终都能解决问题,但老师的做法由于其简洁高效,减少了冗余的条件判断,更具可读性与维护性。因此,在编程实践中,采用更简洁直接的方法,不仅能提高代码的执行效率,还能使代码更容易理解和维护。

希望这篇文章能够帮助你深入理解该问题的解决思路,并通过优化思路提升编程能力。


在这里插入图片描述


在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/11961.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

本地快速部署DeepSeek-R1模型——2025新年贺岁

一晃年初六了&#xff0c;春节长假余额马上归零了。今天下午在我的电脑上成功部署了DeepSeek-R1模型&#xff0c;抽个时间和大家简单分享一下过程&#xff1a; 概述 DeepSeek模型 是一家由中国知名量化私募巨头幻方量化创立的人工智能公司&#xff0c;致力于开发高效、高性能…

3 卷积神经网络CNN

1 Image Classification (Neuron Version) – 1.1 Observation 1 1.2 Observation 2 如果不同的receptive field需要相同功能的neuron&#xff0c;可以使这些neuron共享参数 1.3 Benefit of Convolutional Layer 2 Image Classification (Filter Version) 不用担心filter大小…

QT交叉编译环境搭建(Cmake和qmake)

介绍一共有两种方法&#xff08;基于qmake和cmake&#xff09;&#xff1a; 1.直接调用虚拟机中的交叉编译工具编译 2.在QT中新建编译套件kits camke和qmake的区别&#xff1a;CMake 和 qmake 都是自动化构建工具&#xff0c;用于简化构建过程&#xff0c;管理编译设置&…

STM32 对射式红外传感器配置

这次用的是STM32F103的开发板&#xff08;这里面的exti.c文件没有how to use this driver 配置说明&#xff09; 对射式红外传感器 由一个红外发光二极管和NPN光电三极管组成&#xff0c;M3固定安装孔&#xff0c;有输出状态指示灯&#xff0c;输出高电平灯灭&#xff0c;输出…

SQL优化

1.插入数据 &#xff08;1&#xff09;insert优化 批量插入&#xff1a;insert into tb_test values(1,tom),(2,cat),(3.jerry); 手动提交事务&#xff1a; start transaction; insert into tb_test values(1,tom),(2,cat),(3.jerry); insert into tb_test values(12,tom),(22…

BFS(广度优先搜索)——搜索算法

BFS&#xff0c;也就是广度&#xff08;宽度&#xff09;优先搜索&#xff0c;二叉树的层序遍历就是一个BFS的过程。而前、中、后序遍历则是DFS&#xff08;深度优先搜索&#xff09;。从字面意思也很好理解&#xff0c;DFS就是一条路走到黑&#xff0c;BFS则是一层一层地展开。…

单调队列 滑动窗口(题目分析+C++完整代码)

滑动窗口/单调队列 原题链接 AcWing 154. 滑动窗口 题目描述 给定一个数组。 有一个大小为 k的滑动窗口&#xff0c;它从数组的最左边移动到最右边。 你只能在窗口中看到 k个数字。 每次滑动窗口向右移动一个位置。 以下是一个例子&#xff1a; 该数组为 [1 3 -1 -3 5 3 6 7…

爬虫基础(四)线程 和 进程 及相关知识点

目录 一、线程和进程 &#xff08;1&#xff09;进程 &#xff08;2&#xff09;线程 &#xff08;3&#xff09;区别 二、串行、并发、并行 &#xff08;1&#xff09;串行 &#xff08;2&#xff09;并行 &#xff08;3&#xff09;并发 三、爬虫中的线程和进程 &am…

【C++】B2120 单词的长度

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目描述&#x1f4af;我的做法代码实现&#xff1a;思路解析&#xff1a; &#x1f4af;老师的第一种做法代码实现&#xff1a;思路解析&#xff1a; &#x1f4af;老师的…

nvm的安装和使用

打开地址下载 https://github.com/coreybutler/nvm-windows/releases 推荐下载&#xff0c;nvm-setup.zip 这个。可能有的教程会让下载nvm-noinstall.zip 。noinstall确实下载之后不用安装&#xff0c;但是要自己配置setting.txt文件&#xff0c;以及环境变量 。 安装nvm 在电…

嵌入式知识点总结 操作系统 专题提升(四)-上下文

针对于嵌入式软件杂乱的知识点总结起来&#xff0c;提供给读者学习复习对下述内容的强化。 目录 1.上下文有哪些?怎么理解? 2.为什么会有上下文这种概念? 3.什么情况下进行用户态到内核态的切换? 4.中断上下文代码中有哪些注意事项&#xff1f; 5.请问线程需要保存哪些…

Python在线编辑器

from flask import Flask, render_template, request, jsonify import sys from io import StringIO import contextlib import subprocess import importlib import threading import time import ast import reapp Flask(__name__)RESTRICTED_PACKAGES {tkinter: 抱歉&…

web-SQL注入-CTFHub

前言 在众多的CTF平台当中&#xff0c;作者认为CTFHub对于初学者来说&#xff0c;是入门平台的不二之选。CTFHub通过自己独特的技能树模块&#xff0c;可以帮助初学者来快速入门。具体请看官方介绍&#xff1a;CTFHub。 作者更新了CTFHub系列&#xff0c;希望小伙伴们多多支持…

力扣动态规划-19【算法学习day.113】

前言 ###我做这类文章一个重要的目的还是记录自己的学习过程&#xff0c;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非常非常高滴&#xff01;&#xff01;&#xff01; 习题 1.矩形中移动的最大次数 题目链接…

js笔记(黑马程序员)

js&#xff08;day2&#xff09; 一、运算符 1.赋值运算符 运算符作用加法赋值-减法赋值*乘法复制/除法赋值%取余赋值 2.一元运算符 符号作用说明自增变量自身的值加1&#xff0c;如X--自减变量自身的值减1&#xff0c;如X-- 3.比较运算符 运算符作用>左边是否大于右…

使用Pygame制作“青蛙过河”游戏

本篇博客将演示如何使用 Python Pygame 从零开始编写一款 Frogger 风格的小游戏。Frogger 是一款早期街机经典&#xff0c;玩家需要帮助青蛙穿越车水马龙的马路到达对岸。本示例提供了一个精简原型&#xff0c;包含角色移动、汽车生成与移动、碰撞检测、胜利条件等关键点。希望…

联想拯救者Y9000P IRX8 2023 (82WK) 原厂Win11 家庭中文版系统 带一键还原功能 安装教程

安装完重建winre一键还原功能&#xff0c;和电脑出厂时的系统状态一模一样。自动机型专用软件&#xff0c;全部驱动&#xff0c;主题壁纸&#xff0c;自动激活&#xff0c;oem信息等。将电脑系统完全恢复到出厂时状态。 支持机型 (MTM) : 82WK 系统版本&#xff1a;Windows 1…

2025年02月02日Github流行趋势

项目名称&#xff1a;oumi 项目地址url&#xff1a;https://github.com/oumi-ai/oumi 项目语言&#xff1a;Python 历史star数&#xff1a;1416 今日star数&#xff1a;205 项目维护者&#xff1a;xrdaukar, oelachqar, taenin, wizeng23, kaisopos 项目简介&#xff1a;构建最…

【Elasticsearch】硬件资源优化

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

AJAX笔记原理篇

黑马程序员视频地址&#xff1a; AJAX-Day03-01.XMLHttpRequest_基本使用https://www.bilibili.com/video/BV1MN411y7pw?vd_source0a2d366696f87e241adc64419bf12cab&spm_id_from333.788.videopod.episodes&p33https://www.bilibili.com/video/BV1MN411y7pw?vd_sour…