1、给定一个整数数组,判断是否存在重复元素。
如果存在一值在数组中出现至少两次,函数返回 true 。如果数组中每个元素都不相同,则返回 false .
思路:
先将数组从小到大排列,然后遍历数组,相邻两个数进行比较,若相等就返回true;遍历完成后都不相等就返回false;
#include <iostream>
#include<algorithm>
#include<vector>
using namespace std;
class solution {
public:
//判断是否存在重复元素
bool containsDuplicate(vector<int>&nums) {
sort(nums.begin(), nums.end());
for (int i = 0; i < nums.size()-1; i++) {
if (nums[i] == nums[i + 1]) {
return true;
}
}
return false;
}
};
int main() {
vector<int>v;
v.push_back(0);
v.push_back(1);
v.push_back(3);
v.push_back(4);
v.push_back(2);
v.push_back(7);
solution c;
if (c.containsDuplicate(v)) {
cout << "存在重复元素" << endl;
}
else {
cout << "不存在重复元素" << endl;
}
system("pause");
return 0;
}
2、
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
思路:
两个for循环,先判断第一个元素和其他元素的和是否满足条件,若满足,则输出结果;不满足接着判断第二个元素和其他元素的关系;以此类推;
#include <iostream>
#include<vector>
using namespace std;
//两数之和
//判断一个数组中是否有两个数之和等于目标值
//若有,返回两个数的下标值
class solution {
public:
vector<int> twosum(vector<int>&nums, int target) {
for (int i = 0; i < nums.size(); i++) {
for (int j = i + 1; j < nums.size(); j++) {
if (nums[i] + nums[j] == target) {
//cout << "该数组中," << i << " " << j << "位置对应的和为" << target << endl;
return { i,j };
}
}
}
return {};
}
};
int main() {
vector<int>v;
v.push_back(0);
v.push_back(3);
v.push_back(6);
v.push_back(5);
int target;
cout << "请输入目标值为:";
cin >> target;
solution c;
vector<int>vc = c.twosum(v, target);
if (vc.empty()) {
cout << "该数组中,没有和为 " << target << " 的这样两个数" << endl;
}
else {
cout << "该数组中," << vc[0] << " " << vc[1] << "位置对应的和为" << target << endl;
}
system("pause");
return 0;
}
3、整数反转
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−2^31, 2^31 − 1] ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
思路:(注意反转后的整数范围)
123%10.........=3...........
12%10...........=2...........
1%10.............=1...........
result = (3*10+2)*10 + 1;
#include<iostream>
using namespace std;
//整数反转,例如123反转之后为:321
int reserve(int x) {
int result = 0;
while (x != 0) {
if (x > 214748364 || x < -214748364) {
return 0;
}
result = result*10+x%10;
x /= 10;
}
return result;
}
int main() {
cout << "请输入一个整数:";
int num;
cin >> num;
cout << num << "反转之后为:" << reserve(num) << endl;
system("pause");
return 0;
}
4、回文数
给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。
思路:
同反转数,比较反转之后的数和原来的数相比,相等就是回文数。
注:先用一个变量记录原先x的值,因为后面x改变。(我就是进了这个坑,找了好久才发现这个问题)
#include<iostream>
using namespace std;
//回文数
//数字反转之后和原来数一样
bool huiwen(int x) {
int result = 0;
int origin = x;
if (x < 0 || (x % 10 == 0 && x != 0)) {
return false;
}
while (x != 0) {
if (x > 214748364 || x < -214748364) {
return false;
}
result = result * 10 + x % 10;
x /= 10;
}
return result == origin;
}
int main() {
cout << "请输入一个整数:";
int x;
cin >> x;
if (huiwen(x)) {
cout << x << "是一个回文数。" << endl;
}
else {
cout << x << "不是一个回文数。" << endl;
}
system("pause");
return 0;
}
5、罗马数字转整数
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。
字符 数值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。
通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:
I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。
给定一个罗马数字,将其转换成整数。输入确保在 1 到 3999 的范围内。
#include<iostream>
#include<string>
using namespace std;
int romaInt(string s) {
int n = s.length();
int num = 0;
for (int i = 0; i < n; i++) {
switch (s[i]) {
case 'M':
num += 1000;
break;
case 'D':
num += 500;
break;
case 'C':
if (s[i + 1] == 'D') {
num += 400;
i++;
}
else if (s[i + 1] == 'M') {
num += 900;
i++;
}
else {
num += 100;
}
break;
case 'L':
num += 50;
break;
case 'X':
if (s[i + 1] == 'L') {
num += 40;
i++;
}
else if (s[i + 1] == 'C') {
num += 90;
i++;
}
else {
num += 10;
}
break;
case 'V':
num += 5;
break;
case 'I':
if (s[i + 1] == 'V') {
num += 4;
i++;
}
else if (s[i + 1] == 'X') {
num += 9;
i++;
}
else {
num += 1;
}
break;
}
}
return num;
}
int main() {
cout << "请输入一串字符:";
string s;
cin >> s;
cout << s << "转换为罗马数:" << romaInt(s) << endl;
system("pause");
return 0;
}
6、最长公共前缀
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
思路:
两个for循环,一个for遍历数组中的字符串个数,另一个for循环遍历字符串中的字符;
判断条件是每个字符串的同一个下标对应的字符是否相等,若是则加入到新的字符串中,最后返回此字符串;
下标越界问题:
例如字符串数组是[“catch”,”cat”],当i=3时,第二个字符串已经下标越界了;故对于i的取值只需要满足第一个字符串的长度,其他字符串小于此下标值时才可以继续判断。
#include<iostream>
#include<vector>
#include<string>
using namespace std;
string longestCommonPrefix(vector<string>& s) {
string st = "";
for (int i = 0;i<s[0].length();i++) {
for (int j = 0; j < s.size(); j++) {
if (i >= s[j].length() || s[j][i] != s[0][i]) {
return st;
}
}
st += s[0][i];
}
return st;
}
int main() {
vector<string> s;
cout << "请输入字符串s1:";
string s1;
cin >> s1;
cout << "请输入字符串s2:";
string s2;
cin >> s2;
s.push_back(s1);
s.push_back(s2);
if (longestCommonPrefix(s) != "") {
cout << "最长公共前缀为:" << longestCommonPrefix(s) << endl;
}
else {
cout << "它们不存在公共前缀。" << endl;
}
system("pause");
return 0;
}