力扣刷题-简单篇1

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;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值