最长的单词
问题描述
明明刚开始学习英语的时候,对英语有浓厚的兴趣,但是随着时间的推移,英语单词量的增加,明明越来越觉得背单词是一件相当痛苦的事情。于是他想出各种各样的方法来增加背单词的乐趣。
这次他想出的方法是把所有要背的英语单词排成一行,找出其中最长的一个单词来先背,然后划去这个单词,在剩下的单词中再找出一个最长的单词来背,以此类推,直到把所有单词都背完。如果有多个长度相同的单词,则先背一行中靠前的那个单词。这样做的好处是:背到越后面,单词越短,越容易背,越能增加背单词的信心。
例如有这么一行单词: one two three four five 明明会首先挑出three来背,因为它是最长的一个单词,由5个字母组成;然后明明会选择four这个单词,虽然five这个单词的长度和four这个单词的长度一样,但是four在five的前面,所以明明会先背four这个单词,然后再背five,等明明把five这个单词背完以后,接着背one这个单词,最后背的是two这个单词。
但是在这样背单词之中,明明又发现了另一个问题,当要背非常多的单词时,寻找最长的单词会花很多时间,他想让你帮助他写一个程序,找出一行单词中最长的那个,节约明明背单词所花的时间,与此同时,明明希望你能告诉他这个英文单词有多少个字母组成,那他可以做到心里有数。
明明的问题可以归结为:在一行英文单词中,找出其中最长的单词(若有多个最长,找出第一个出现的),并输出这个单词的长度。
总结
1.逐行读取输入,用字符串流分割每行的单词(自动处理多个空格);
2. 遍历分割后的单词,记录长度最长且最先出现的单词
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
int main() {
string line;
while (getline(cin, line)) {
istringstream iss(line);
string word, max_word;
int max_len = 0;
while (iss >> word) {
int len = word.size();
if (len > max_len) {
max_len = len;
max_word = word;
}
}
if (!max_word.empty()) {
cout << max_len << " " << max_word << endl;
}
}
return 0;
}
求字符串的起始位置
问题描述
在程序设计中,对字符串的处理是经常遇到的一个问题。
例如,将字符串中所有的英文字母变成大写,或者将一个字符串与另一个字符串连接构成一个新的字符串。
由于此类的操作非常普遍,因此,在设计程序语言的时候,设计者就已经把这类操作的代码写好了,如果编程人员要使用这些代码,只需把该类代码的头文件包含到自己的程序中,编程人员就可以很简单的调用,这样使编程节省了不少时间。
明明是一名项目经理,他现在负责一种新的程序设计语言的开发,现在需要预先实现大量的和处理字符串有关的功能方法,以后这些方法会包含到程序设计语言中,方便程序语言使用者的开发。你是明明手下的一名软件工程师,明明分配给你一个任务,在两个字符串中,找到一个字符串在另一个字符串中的起始位置。 例如,有两个字符串,一个字符串s= “abc”,另一个字符串subs=“bc”,现在就要找出“bc”在“abc”中的其实位置,在这个例子中,“bc”的起始位置为2。
明明的问题可以归结为:输入两串字符串s和subs,求s中subs的起始位置。
总结
1. 循环读取多组 s 和 subs,直到输入结束;
2. 遍历原字符串 s 的每个可能起始位置,截取与 subs 长度相同的子串进行比较
3. 找到则返回 “索引 + 1”(转换为 1 开始的位置),未找到则返回 0
#include <iostream>
#include <string>
using namespace std;
int findSubstringPos(const string &s, const string &subs) {
int s_len = s.size();
int sub_len = subs.size();
if (sub_len == 0 || sub_len > s_len) {
return 0;
}
for (int i = 0; i <= s_len - sub_len; ++i) {
bool match = true;
for (int j = 0; j < sub_len; ++j) {
if (s[i + j] != subs[j]) {
match = false;
break;
}
}
if (match) {
return i + 1;
}
}
return 0;
}
int main() {
string s, subs;
while (getline(cin, s)) {
if (!getline(cin, subs)) {
break;
}
int pos = findSubstringPos(s, subs);
cout << pos << endl;
}
return 0;
}
隐藏口令
问题描述
有时候程序员有很奇怪的方法来隐藏他们的口令。
Billy"Hacker"Geits会选择一个字符串S(由L个小写字母组成,5<=L<=100,000),然后他把S顺时针绕成一个圈。
如字符串cbadfa,绕成一个圈后,我们认为字符串首尾相连。
每次取其中一个字母作为起始字母,并顺时针依次取字母而组成一个字符串。这样将得到一些字符串。
比如字符串cbadfa,按照以上规则取出的字符串有:
cbadfa badfac adfacb dfacba facbad acbadf
我们找到最小的那个字符串,可知为acbadf,也可知道它的第一个字符'a'在原字符串cbadfa中为第6个字符(位置从1开始),
将得到的结果6减1得到5,这就是我们需要的口令。
再比如字符串alabala,绕成一个圈后,每次取其中一个字母作为起始字母,并顺时针依次取字母而组成一个字符串。这样将得到一些字符串:
alabala labalaa abalaal balaala alaalab laalaba aalabal
我们找到最小的那个字符串,可知为aalabal,它的第一个字母'a'在原字符串中位置为7,7-1=6,则6为口令。
注:如果按照规则有两个字符串都是最小的,则取前面那一个。
总结
1. 初始化双指针 i=0、j=1,k=0(偏移量)
2. 比较 s [(i+k)% n] 和 s [(j+k)% n],根据大小关系移动指针
3. 最终取 i、j 中较小值,即为最小表示的起始索引(0 开始),直接输出该索引
#include <iostream>
#include <string>
using namespace std;
int findMinIndex(const string &s) {
int n = s.size();
int i = 0, j = 1, k = 0;
while (i < n && j < n && k < n) {
char a = s[(i + k) % n];
char b = s[(j + k) % n];
if (a == b) {
k++;
} else {
if (a > b) {
i += k + 1;
} else {
j += k + 1;
}
if (i == j) {
j++;
}
k = 0;
}
}
return min(i, j);
}
int main() {
int L;
string s, temp;
cin >> L;
while (cin >> temp) {
s += temp;
if (s.size() >= L) {
break;
}
}
s = s.substr(0, L);
int result = findMinIndex(s);
cout << result << endl;
return 0;
}
计算机英语翻译
一、前言
计算机硬件是一个设备,它包含了一个计算机一系列的功能,由多个成分组成,还可以被实体的处理(可被物理操作)。这些成分的功能常常被划分为三种大类:输入,输出,和存储。这些大类的成分,被微处理器所连接,计算机的中心处理单元叫cpu,电路提供给他可以计算和控制计算机的能力,通过波或者电路的东西被称之为总线。
软件,在另一方面来说,就是计算机用来处理数据的一系列的指令,比如一个单词的处理程序,或者一个音频游戏。这些程序通常通过计算机的硬件被存储和接收(传输)。软件也掌控了硬件如何被使用。比如,信息是如何从一个存储设备中重新获取。联系输入和输出的硬件被软件中名为Input/Output的系统控制
尽管微处理器仍然在技术上被视为是硬件,他分离出来的功能也与计算机软件联系。因为处理器有软件硬件两方面的特点,他因此被视为frimware。
①transfer v.传输
②retrieve v.检索
③firmware n.固件
单词打卡


340

被折叠的 条评论
为什么被折叠?



