我在代码随想录|写代码Day5之242. 有效的字母异位词,349. 两个数组的交集,202. 快乐数,1. 两数之和
第一题 : 242. 有效的字母异位词
题目:
代码
代码解析
主要思路是定义俩哈希表,然后将分别将俩,字符串导入哈希表(可以避免函数引用导致的问题,就是如果字符串相同然后只是位置不同,这个样子哈希表每个字符索引的值会相等),然后就可以判断是否符合题目要求。
第二题: 349. 两个数组的交集
题目:
思路解析:
主要思路是定义俩哈希表,然后将分别将俩,字符串导入哈希表(可以避免函数引用导致的问题,
然后这题和上一道题其实差不多,还是要从hash表的元素存在排除,一个hash表用于记录我们一个容器中的元素,一个用于记录我们是否存储相通元素
代码
第三题: 202. 快乐数
题目:
class Solution {
public:
int bitSquareSum(int n) {
int sum = 0;
while(n > 0)
{
int bit = n % 10;
sum += bit * bit;
n = n / 10;
}
return sum;
}
bool isHappy(int n) {
int slow = n, fast = n;
do{
slow = bitSquareSum(slow);
fast = bitSquareSum(fast);
fast = bitSquareSum(fast);
}while(slow != fast);
return slow == 1;
}
};
代码解析
方法:
使用 “快慢指针” 思想,找出循环:“快指针” 每次走两步,“慢指针” 每次走一步,当二者相等时,即为一个循环周期。此时,判断是不是因为 1 引起的循环,是的话就是快乐数,否则不是快乐数。
注意:此题不建议用集合记录每次的计算结果来判断是否进入循环,因为这个集合可能大到无法存储;另外,也不建议使用递归,同理,如果递归层次较深,会直接导致调用栈崩溃。不要因为这个题目给出的整数是 int 型而投机取巧。
第四题: 1. 两数之和
题目
思路分析
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
比如:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
代码
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
int n = nums.size();//提高代码风格
for(int i = 0;i < n;i++){
for(int j = i + 1;j < n;j++){
if(nums[i] +nums[j] == target){
vector<int>ans;
ans.push_back(i);
ans.push_back(j);
return ans;
}
}
}
return nums;
}
};
第五题: 小天的魔法 (nowcoder.com)
题目
思路分析
输入我这里就不再过多的描述,这题为简单题,写这题主要俩个重点:
#不能连续使用魔法1
1.排序->确定攻击强度
2.条件判断
排序C++中有sort()函数
条件判断要遍历多种情况,(遍历长度不大于最长的遍历)
如果小于1就返回答案,因为我们使用魔法2,当怪物的血量小于 1 时,怪物就被击败了。这个时候返回我们的次数。
#include <bits/stdc++.h>
using namespace std;
int n, m, x;
int a[101], b[101];
int main()
{
cin >> n >> m >> x;
for (int i = 1; i <= n; i++)
cin >> a[i];
sort(a + 1, a + n + 1);
for (int i = 1; i <= m; i++)
cin >> b[i];
sort(b + 1, b + m + 1);
int j = n, z = m;
int ans = 0;
for (int i = 0; i <= max(n, m); i++)//这里要等于max(n, m)要不然会少一次循环
{
if (x < 1)
{
cout << ans;
return 0;
}
if (b[z] >= x) {
ans++;
x -= b[z];
} else if (b[z] + b[z - 1] <= a[j]*b[z]) {
ans += 2;//判断俩数相乘是更大还是相加更大
x -= a[j] * b[z];//如果相乘执行
j--;
z--;
} else if (b[z] + b[z - 1] > a[j]*b[z]) {
ans += 2;//如果相加执行
x -= b[z] + b[z - 1];
z -= 2;
}
}
cout << -1;
return 0;
}
另外版本代码
#include<bits/stdc++.h>
using namespace std;
int n,m,x;
int ans=0;
int a[105];
int b[105];
int main(){
cin>>n>>m>>x;
for(int i=0;i<n;i++){
cin>>a[i];
}
for(int j=0;j<m;j++){
cin>>b[j];
}
sort(a,a+n);
sort(b,b+m);
int k=n-1,l=m-1;
for(int i=0;i<=max(n,m);i++){//这里要等于max(n,m)要不然会少一次循环
if(x<1){
cout<<ans<<endl;
return 0;
}
if(b[l]>=x){
ans++;
x-=b[l];
l--;
}else if(b[l]+b[l-1] <= a[k]*b[l]){
ans+=2;
x-= a[k]*b[l];
k--;
l--;
}else if(b[l]+b[l-1] > a[k]*b[l]){
ans+=2;
x-=b[l]+b[l-1];
l-=2;
}
}
cout<<-1;
return 0;
}
代码解释
如果b的最后一个元素大于或等于x,则使用它并递增ans,如果b的最后两个元素的组合小于或等于,最后一个元素a和b的乘积,使用乘积并将ans增加2,如果b的最后两个元素的组合大于乘积,在a和b的最后两个元素中,使用b的最后二个元素之和,并将ans增加2,因为a不能连续用所以我们要判断b[z] + b[z - 1] 和 a[j]*b[z] 的大小。
第六题 : 小红的矩阵构造 (nowcoder.com)
题目
看题目发现我真的被骗了 哭
就是一个奇数一个偶数QAQ
代码: 简单的一批!!!!
/**
* Created by 5cm/s on 2023/12/18 19:07:55.
* 诸天神佛,佑我上分!
**/
#include<bits/stdc++.h>
int main(void)
{
int n;
std::cin>>n;
int lne = 1;
for (int i = 1; i <= n * n; i += n){
if (lne % 2 != 0){
for (int j = i, z = 0; z < n; z++, j++){
std::cout<<j<<" ";
}
}else{
for (int j = i + n - 1, z = 0; z < n; z++, j--){
std::cout<<j<<" ";
}
}
std::cout<<"\n";
lne++;
}
}
好今天就以我被骗的题目结尾,希望大家早日成为大佬。
本文作者:2c237c6
本文链接:https://www.cnblogs.com/27dCnc/p/18568672
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了