C/C++每日一练(20230318) 2 的幂、打印年历、路径交叉

文章提供了三个编程题目,包括判断一个整数是否为2的幂次方(使用循环、递归和位运算的方法),打印年历的代码实现,以及判断路径是否交叉的算法。这些题目涉及基础的算法知识和编程技巧,适合进行日常练习。

目录

1. 2 的幂  🌟

2. 打印年历  🌟

3. 路径交叉  🌟🌟🌟

🌟 每日一练刷题专栏 🌟

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏


1. 2 的幂

给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false 。

如果存在一个整数 x 使得 n == 2^x ,则认为 n 是 2 的幂次方。

示例 1:

输入:n = 1
输出:true
解释:2^0 = 1

示例 2:

输入:n = 16
输出:true
解释:2^4 = 16

示例 3:

输入:n = 3
输出:false

示例 4:

输入:n = 4
输出:true

示例 5:

输入:n = 5
输出:false

提示:

  • -2^31 <= n <= 2^31 - 1

进阶:你能够不使用循环/递归解决此问题吗?

代码:

#include <bits/stdc++.h>
using namespace std;

class Solution{
public:
    bool isPowerOfTwo(int n){
        if (n < 1) return false;
        while (n%2 == 0) n /= 2;
        return n == 1;
	}
	void PowerOfTwo(int n){
		cout << (isPowerOfTwo(n) ? "true" : "false") << endl;
	}
};

int main()
{
	Solution s;
    s.PowerOfTwo(1);
    s.PowerOfTwo(16);
    s.PowerOfTwo(3);
    s.PowerOfTwo(4);
    s.PowerOfTwo(5);

	return 0;
}

输出:

true
true
false
true
false 

递归法:

#include <bits/stdc++.h>
using namespace std;

class Solution{
public:
    bool isPowerOfTwo(int n){
        if (n < 1) return false;
        else if (n == 1) return true;
        else return n % 2 == 0 && isPowerOfTwo(n / 2);
	}
	void PowerOfTwo(int n){
		cout << (isPowerOfTwo(n) ? "true" : "false") << endl;
	}
};

int main()
{
	Solution s;
    s.PowerOfTwo(1);
    s.PowerOfTwo(16);
    s.PowerOfTwo(3);
    s.PowerOfTwo(4);
    s.PowerOfTwo(5);

	return 0;
}

进阶: 位运算,可以不使用循环/递归

2^n满足条件: n & (n - 1) == 0

#include <bits/stdc++.h>
using namespace std;

class Solution{
public:
    bool isPowerOfTwo(int n){
        return n > 0 && (n & (n - 1)) == 0;
    }
	void PowerOfTwo(int n){
		cout << (isPowerOfTwo(n) ? "true" : "false") << endl;
	}
};

int main()
{
	Solution s;
    s.PowerOfTwo(1);
    s.PowerOfTwo(16);
    s.PowerOfTwo(3);
    s.PowerOfTwo(4);
    s.PowerOfTwo(5);

	return 0;
}

2. 打印年历

要求:模仿现实生活中的挂历。 当前页以系统当前日期的月份为准显示当前月的每一天(显示出日及对应的星期几)。 当系统日期变到下一月时,系统自动翻页到下一月。

代码:

#include <stdio.h>
int year(int y)
{
    if ((y%4==0) && (y%100!=0) || y%400==0)
        return 366;
    else
        return 365;
}
int main()
{
    int y;
    int i,j,sum=0;    
    int begin,week;
    int days[12]={31,28,31,30,31,30,31,31,30,31,30,31};
    scanf("%d",&y);
    for(i=1;i<y;i++)
        sum+=year(i);
    week=(sum+1)%7;        
    if(year(y)==366)
        days[1]=29;    
    printf("\n%d年日历如下:\n",y);
    for(i=0;i<12;i++)
    {
        printf("       %d月          \n",i+1);
        printf("  7  1  2  3  4  5  6\n");
        printf("=====================\n");
        begin=1;
        for(j=0;j<week;j++)
            printf("   ");
        while(begin<=days[i])
        {
            printf("%3d",begin);
            begin++;
            week=(week+1)%7;
            if(week%7==0)
                printf("\n");
        }
        printf("\n");
    }
    return 0;
}

输出:

2023

2023年日历如下:
       1月
   7   1   2   3   4   5   6
=====================
        1   2   3   4   5   6
   8   9 10 11 12 13 14
 15 16 17 18 19 20 21
 22 23 24 25 26 27 28
 29 30 31
       2月
   7   1   2   3   4   5   6
=====================
                  1   2   3   4
   5   6   7   8   9 10 11
 12 13 14 15 16 17 18
 19 20 21 22 23 24 25
 26 27 28
       3月
   7   1   2   3   4   5   6
=====================
                  1   2   3   4
   5   6   7   8   9 10 11
 12 13 14 15 16 17 18
 19 20 21 22 23 24 25
 26 27 28 29 30 31
       4月
   7   1   2   3   4   5   6
=====================
                                 1
   2   3   4   5   6   7   8
   9 10 11 12 13 14 15
 16 17 18 19 20 21 22
 23 24 25 26 27 28 29
 30
       5月
   7   1   2   3   4   5   6
=====================
        1   2   3   4   5   6
   7   8   9 10 11 12 13
 14 15 16 17 18 19 20
 21 22 23 24 25 26 27
 28 29 30 31
       6月
   7   1   2   3   4   5   6
=====================
                       1   2   3
   4   5   6   7   8   9 10
 11 12 13 14 15 16 17
 18 19 20 21 22 23 24
 25 26 27 28 29 30
       7月
   7   1   2   3   4   5   6
=====================
                                 1
   2   3   4   5   6   7   8
   9 10 11 12 13 14 15
 16 17 18 19 20 21 22
 23 24 25 26 27 28 29
 30 31
       8月
   7   1   2   3   4   5   6
=====================
             1   2   3   4   5
   6   7   8   9 10 11 12
 13 14 15 16 17 18 19
 20 21 22 23 24 25 26
 27 28 29 30 31
       9月
   7   1   2   3   4   5   6
=====================
                            1   2
   3   4   5   6   7   8   9
 10 11 12 13 14 15 16
 17 18 19 20 21 22 23
 24 25 26 27 28 29 30

       10月
   7   1   2   3   4   5   6
=====================
   1   2   3   4   5   6   7
   8   9 10 11 12 13 14
 15 16 17 18 19 20 21
 22 23 24 25 26 27 28
 29 30 31
       11月
   7   1   2   3   4   5   6
=====================
                  1   2   3   4
   5   6   7   8   9 10 11
 12 13 14 15 16 17 18
 19 20 21 22 23 24 25
 26 27 28 29 30
       12月
   7   1   2   3   4   5   6
=====================
                            1   2
   3   4   5   6   7   8   9
 10 11 12 13 14 15 16
 17 18 19 20 21 22 23
 24 25 26 27 28 29 30
 31


3. 路径交叉

给你一个整数数组 distance 

从 X-Y 平面上的点 (0,0) 开始,先向北移动 distance[0] 米,然后向西移动 distance[1] 米,向南移动 distance[2] 米,向东移动 distance[3] 米,持续移动。也就是说,每次移动后你的方位会发生逆时针变化。

判断你所经过的路径是否相交。如果相交,返回 true ;否则,返回 false 。

示例 1:

输入:distance = [2,1,1,2]
输出:true

示例 2:

输入:distance = [1,2,3,4]
输出:false

示例 3:

输入:distance = [1,1,1,1]
输出:true

提示:

  • 1 <= distance.length <= 10^5
  • 1 <= distance[i] <= 10^5

代码:

#include <bits/stdc++.h>
using namespace std;

class Solution
{
public:
    bool isSelfCrossing(vector<int> &distance)
    {
        int all_step = distance.size(), current_step = 0;
        if (all_step < 4)
            return false;
        current_step = 2;
        while (current_step < all_step && distance[current_step] > distance[current_step - 2])
            current_step++;
        if (current_step == all_step)
            return false;
        if (distance[current_step] >= distance[current_step - 2] - (current_step > 3 ? distance[current_step - 4] : 0))
            distance[current_step - 1] -= current_step > 2 ? distance[current_step - 3] : 0;
        current_step++;
        while (current_step < all_step && distance[current_step] < distance[current_step - 2])
            current_step++;
        return current_step != all_step;
    }
};

int main()
{
	Solution s;
	vector<int> nums = {2,1,1,2};
	cout << (s.isSelfCrossing(nums) ? "true" : "false") << endl;

	nums = {1,2,3,4};
	cout << (s.isSelfCrossing(nums) ? "true" : "false") << endl;
	
	nums = {1,1,1,1};
	cout << (s.isSelfCrossing(nums) ? "true" : "false") << endl;
	
	return 0;
} 

输出:

true
false
true


🌟 每日一练刷题专栏 🌟

持续,努力奋斗做强刷题搬运工!

👍 点赞,你的认可是我坚持的动力! 

🌟 收藏,你的青睐是我努力的方向! 

评论,你的意见是我进步的财富!  

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hann Yang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值