我在代码随想录|写代码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++;
  }
}

好今天就以我被骗的题目结尾,希望大家早日成为大佬。

  • 9
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值