【笔试常见编程题02】字符串中找出连续最长的数字串、数组中出现次数超过一半的数字、计算糖果、进制转换

本文主要是介绍【笔试常见编程题02】字符串中找出连续最长的数字串、数组中出现次数超过一半的数字、计算糖果、进制转换,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

1. 字符串中找出连续最长的数字串

读入一个字符串str,输出字符串str中的连续最长的数字串
输入描述
个测试输入包含1个测试用例,一个字符串str,长度不超过255。
输出描述
在一行内输出str中里连续最长的数字串。
示例 1
输入
abcd12345ed125ss123456789
输出
123456789

思路1:

  1. 定义两个string,longfig和temp
  2. temp获取数字字符串,longfig保留最长数字字符串
    如果temp比longfig长,把temp赋值给longfig,temp置空
int main() {string s, longfig, temp; // longfig用来保存最长数字字符串getline(cin, s); for (int i = 0; i < s.size(); i++) // 遍历输入的字符串{while (s[i] - '0' >= 0 && s[i] - '0' <= 9) // 如果为数字,保存到temp{temp += s[i];i++;}if (temp.size() > longfig.size()) // 如果temp比longfig长,则把temp赋值给longfiglongfig = temp;temp = "";}cout << longfig;return 0;
}

2. 数组中出现次数超过一半的数字

给一个长度为 n 的数组,数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
例如输入一个长度为9的数组[1,2,3,2,2,2,5,4,2]。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。
数据范围:,数组中元素的值
要求:空间复杂度:,时间复杂度
示例 1
输入
[1,2,3,2,2,2,5,4,2]
输出
2
示例 2
输入
[3,3,3,3,2,2,2]
输出
3
示例 3
输入
[1]
输出
1

思路1:

  1. 排序数组
    数字出现次数超过数组长度的一半
    中间那个数一定是最长数组
class Solution {
public:int MoreThanHalfNum_Solution(vector<int>& numbers) {sort(numbers.begin(), numbers.end());return numbers[numbers.size() / 2];}
};

思路2:

  1. 遍历一遍数组
  2. 在map中存每个元素出现的次数
    然后再遍历一次数组,找出众数
class Solution {
public:int MoreThanHalfNum_Solution(vector<int> numbers) {unordered_map<int,int> mp;for (const int val : numbers) ++mp[val];for (const int val : numbers) {if (mp[val] > numbers.size() / 2 ) return val;}return 0;}
};

思路3:(最优解)时间和空间复杂度:O(n),O(1)
如果两个数不相等,就消去这两个数,最坏情况下,每次消去一个众数和一个非众数,那么如果存在众数,最后留下的数肯定是众数

  1. 初始化:候选人cond = -1, 候选人的投票次数cnt = 0
  2. 遍历数组,如果cnt=0, 表示没有候选人,则选取当前数为候选人,++cnt
  3. 否则,如果cnt > 0, 表示有候选人,如果当前数=cond,则++cnt,否则–cnt
  4. 直到数组遍历完毕,最后检查cond是否为众数
class Solution {
public:int MoreThanHalfNum_Solution(vector<int> numbers) {int cond = -1;int cnt = 0;for (int i=0; i<numbers.size(); ++i) {if (cnt == 0) {cond = numbers[i];++cnt;}else {if (cond == numbers[i]) ++cnt;else --cnt;}}cnt = 0;for (const int k :numbers) {if (cond == k) ++cnt;}if (cnt > numbers.size() / 2) return cond;return 0;}
};

3. 计算糖果

A,B,C三个人是好朋友,每个人手里都有一些糖果,我们不知道他们每个人手上具体有多少个糖果,但是我们知道以下的信息:
A - B, B - C, A + B, B + C. 这四个数值.每个字母代表每个人所拥有的糖果数.
现在需要通过这四个数值计算出每个人手里有多少个糖果,即A,B,C。这里保证最多只有一组整数A,B,C满足所有题设条件。
输入描述
输入为一行,一共4个整数,分别为A - B,B - C,A + B,B + C,用空格隔开。 范围均在-30到30之间(闭区间)。
输出描述
输出为一行,如果存在满足的整数A,B,C则按顺序输出A,B,C,用空格隔开,行末无空格。 如果不存在这样的整数A,B,C,则输出No
示例 1
输入
1 -2 3 4
输出
2 1 3

思路1:

  1. (整数1 + 整数3) / 2 = A
  2. (整数2 + 整数4) / 2 = B
  3. B - 整数2 = C
int main() {vector<int> v;int a, b, c;v.resize(4);for (int i = 0; i < 4; i++)cin >> v[i];a = (v[0] + v[2]) / 2;b = (v[1] + v[3]) / 2;c = b - v[1];if (a-b == v[0] && b-c == v[1] && a+b == v[2] && b+c == v[3])cout << a << " " << b << " " << c;else cout << "No";return 0;
}

4. 进制转换

给定一个十进制数M,以及需要转换的进制数N。将十进制数M转化为N进制数
输入描述
输入为一行,M(32位整数)、N(2 ≤ N ≤ 16),以空格隔开。
输出描述
为每个测试实例输出转换后的数,每个输出占一行。如果N大于9,则对应的数字规则参考16进制(比如,10用A表示,等等)
示例 1
输入
7 2
输出
111

思路1:

  1. 十进制转任何其他进制都可以用
    十进制数取模需要转换的进制(转二进制就取模二)
    取模的结果记录下来
  2. 十进制数除以需要转换的进制,所得的结果继续取模
  3. 直到十进制数为0,逆置所有取模的结果就是需要转换的进制

本题需要注意的是十进制数可能为0
和负数的情况,需要特殊处理

void TenScaleConvertOther(int M, int N, string& s) // 十进制转其他进制函数
{char figure[] = { '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' };while (M) {s.push_back(figure[M % N]);M = M / N;}
}int main() {int M, N;cin >> M >> N;string s;if (M == 0) // 需要考虑M为0的情况s.push_back('0');TenScaleConvertOther(abs(M), N, s); // M可能为负数, 传绝对值过去reverse(s.begin(), s.end());if (M < 0)cout << '-' << s;else cout << s;   return 0;
}

这篇关于【笔试常见编程题02】字符串中找出连续最长的数字串、数组中出现次数超过一半的数字、计算糖果、进制转换的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/654425

相关文章

Java controller接口出入参时间序列化转换操作方法(两种)

《Javacontroller接口出入参时间序列化转换操作方法(两种)》:本文主要介绍Javacontroller接口出入参时间序列化转换操作方法,本文给大家列举两种简单方法,感兴趣的朋友一起看... 目录方式一、使用注解方式二、统一配置场景:在controller编写的接口,在前后端交互过程中一般都会涉及

Java中的StringBuilder之如何高效构建字符串

《Java中的StringBuilder之如何高效构建字符串》本文将深入浅出地介绍StringBuilder的使用方法、性能优势以及相关字符串处理技术,结合代码示例帮助读者更好地理解和应用,希望对大家... 目录关键点什么是 StringBuilder?为什么需要 StringBuilder?如何使用 St

Java并发编程之如何优雅关闭钩子Shutdown Hook

《Java并发编程之如何优雅关闭钩子ShutdownHook》这篇文章主要为大家详细介绍了Java如何实现优雅关闭钩子ShutdownHook,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 目录关闭钩子简介关闭钩子应用场景数据库连接实战演示使用关闭钩子的注意事项开源框架中的关闭钩子机制1.

Java Spring 中 @PostConstruct 注解使用原理及常见场景

《JavaSpring中@PostConstruct注解使用原理及常见场景》在JavaSpring中,@PostConstruct注解是一个非常实用的功能,它允许开发者在Spring容器完全初... 目录一、@PostConstruct 注解概述二、@PostConstruct 注解的基本使用2.1 基本代

Java对象转换的实现方式汇总

《Java对象转换的实现方式汇总》:本文主要介绍Java对象转换的多种实现方式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Java对象转换的多种实现方式1. 手动映射(Manual Mapping)2. Builder模式3. 工具类辅助映

Java中字符串转时间与时间转字符串的操作详解

《Java中字符串转时间与时间转字符串的操作详解》Java的java.time包提供了强大的日期和时间处理功能,通过DateTimeFormatter可以轻松地在日期时间对象和字符串之间进行转换,下面... 目录一、字符串转时间(一)使用预定义格式(二)自定义格式二、时间转字符串(一)使用预定义格式(二)自

SQL中redo log 刷⼊磁盘的常见方法

《SQL中redolog刷⼊磁盘的常见方法》本文主要介绍了SQL中redolog刷⼊磁盘的常见方法,将redolog刷入磁盘的方法确保了数据的持久性和一致性,下面就来具体介绍一下,感兴趣的可以了解... 目录Redo Log 刷入磁盘的方法Redo Log 刷入磁盘的过程代码示例(伪代码)在数据库系统中,r

python实现svg图片转换为png和gif

《python实现svg图片转换为png和gif》这篇文章主要为大家详细介绍了python如何实现将svg图片格式转换为png和gif,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录python实现svg图片转换为png和gifpython实现图片格式之间的相互转换延展:基于Py

SQL BETWEEN 的常见用法小结

《SQLBETWEEN的常见用法小结》BETWEEN操作符是SQL中非常有用的工具,它允许你快速选取某个范围内的值,本文给大家介绍SQLBETWEEN的常见用法,感兴趣的朋友一起看看吧... 在SQL中,BETWEEN是一个操作符,用于选取介于两个值之间的数据。它包含这两个边界值。BETWEEN操作符常用

Python实现特殊字符判断并去掉非字母和数字的特殊字符

《Python实现特殊字符判断并去掉非字母和数字的特殊字符》在Python中,可以通过多种方法来判断字符串中是否包含非字母、数字的特殊字符,并将这些特殊字符去掉,本文为大家整理了一些常用的,希望对大家... 目录1. 使用正则表达式判断字符串中是否包含特殊字符去掉字符串中的特殊字符2. 使用 str.isa