初阶必刷编程50题

本文提供了一组针对初学者的编程练习题,涵盖Java的基础数据类型、判断语句、数组和循环、字符串处理、栈与队列以及简单递归等主题。通过解决这些题目,学习者可以巩固编程基础知识并提升解决问题的能力。
摘要由CSDN通过智能技术生成

一 、基本数据类型

1.A+B问题

请添加图片描述

public class Solution {
   
    /**
     * @param a: An integer
     * @param b: An integer
     * @return: The sum of a and b 
     */
    public int aplusb(int a, int b) {
   
        return a+b;
    }
}

2.反转一个三位整数

请添加图片描述

 public int reverseInteger(int number) {
   
        if(number>=100 && number<1000){
   
            int a = number%10;
            int b = number/10%10;
            int c = number/100%10;
            return a*100+b*10+c;
        }
        return -1;
    }

3.计算圆周长和面积

请添加图片描述

public double[] calculate(int r) {
   
        double[] a = new double[2];
        a[0] = 2 * 3.14 * r;
        a[1] = 3.14 * r * r;
        return a;
    }

4.巴什博弈

请添加图片描述请添加图片描述

public boolean canWinBash(int n) {
   
        // Write your code here
        
        return n%4!=0;
    }

1+3=4;只要最后对方拿时,剩余石头数是4,则我方必赢,因为无论对方拿几,我方都能一次拿完;
题目变为:n能不能变为4,由此发现只要我们首次取n%4个石头,对方就会从4的倍数开始取(因为我们取走了余数,剩余一定被4整除),那么接下来,无论对方取几(1,2,3都不大于4),我们总能让对方一直处于4的倍数状态,直到获胜,
因此题目最终变为:n能否被4整除;如不能则我方获胜,如果能则我方失败;

二、判断语句

5.判断数字与字母字符

请添加图片描述

public boolean isAlphanumeric(char c) {
   
        // write your code here
        // return Character.isLetter(c) || Character.isDigit(c);
        return (c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z')|| (c >= 'a' && c <= 'z');
    }

6.闰年

请添加图片描述

public boolean isLeapYear(int n) {
   
        return (n % 4 == 0 && (n % 100 != 0 || n % 400 == 0));
    }

7.大小写转换

请添加图片描述
解题思路

ASCII编码表中,A=65,a=97,以此类推,每个小写字母与大写字母间隔32,所以小写字母转大写字母,直接小写字母-32就ok,大写字母转小写字母的话就+32,毕竟人家表上写的好好的,对照着用呗。

public char lowercaseToUppercase(char character) {
   
        // write your code here
        return character -= 32;
    }

8.月份天数

请添加图片描述

public int getTheMonthDays(int year, int month) {
   
        int[] day = new int[]{
   0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
        if (month == 2) {
   
            if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {
   
                return 29;
            }
        }
        return day[month];
    }

9.简单计算器

请添加图片描述

 public int calculate(int a, char operator, int b) {
   
        // write your code here
         switch (operator) {
   
            case '*':
                return a * b;
            case '/':
                return a / b;
            case '-':
                return a - b;
            default:
                return a + b;
        }
    }

10.三数之中的最大值

请添加图片描述

public int maxOfThreeNumbers(int num1, int num2, int num3) {
   
        // write your code here
        int a=num1>num2?num1:num2;//a为num1henum2中最大值
        return a>num3?a:num3;
    }

三、数组和循环

11.打印X

请添加图片描述请添加图片描述
请添加图片描述

public List<String> printX(int n) {
        
        ArrayList<String> res=new ArrayList<>();//创建一个存放String类型属性的ArrayList,名称为res
        char[] line=new char[n];//创建一个长度为n的字符型数组line
        for(int i=0;i<n;i++){
   //外循环遍历正整数n的次数
            for(int j=0;j<n;j++){
   //该循环为了辅助初始化字符型数组中的每个属性
                line[j]=' ';//初始化字符型数组中的每个属性
            }
            line[i]='X';//左边对应位置赋值"X“
            line[n-i-1]='X';//右边对应位置赋值“X”
            res.add(String.valueOf(line));//将得到的line转换成字符串的形式增加到ArrayList
        }
        return res;//返回ArrayList
    }

12.数组的最大值

请添加图片描述

public float maxOfArray(float[] A) {
   
        // write your code here
        float max = A[0];
        for(int i = 0;i < A.length;i++){
   
            if(max < A[i]){
   
                max = A[i];
            }
        }
        return max;
    }

13.生成给定大小的数组

请添加图片描述

public List<Integer> generate(int size) {
   
        // write your code here
        List<Integer> list = new ArrayList<>(size);
        for(int i = 0;i < size;i++){
   
            list.add(i+1);
        }
        return list;
    }

14.移动零

请添加图片描述

算法:双指针
算法思路

使用两个指针right和left,left为新数组的指针,right为原数组的指针,原数组指针向后扫,遇到非0的数就赋值给新数组的指针位置,并将新数组指针向后移动

代码思路

将两个指针先指向0,即数组头部

right向后扫描,当遇到非0数即nums[right] != 0时,将其赋值给新数组指针指向的位置,即nums[left] = nums[right],并将left向后移动一位

若新数组指针还未指向尾部,即剩余的位置都是0,将剩余数组赋值为0

复杂度分析

N表示数组nums长度

空间复杂度:O(1)

时间复杂度:O(N)

public void moveZeroes(int[] nums) {
   
        //将两个指针先指向数组头部
        int left = 0, right = 0;
        while (right < nums.length) {
   
            // 遇到非0数赋值给新数组指针指向的位置
            if (nums[right] != 0) {
   
                nums[left] = nums[right];
                // 将left向后移动一位
                left++;
            }
            right++;
        }

        // 若新数组指针还未指向尾部,将剩余数组赋值为0
        while (left < nums.length) {
   
            nums[left] = 0;
            left++;
        }
    }

15.寻找最大值

请添加图片描述

public int maxNum(List<Integer> nums) {
   
        // write your code here
        int max = nums.get(0);
        for(int num : nums){
   
            if(num > max){
   
                max = num;
            }
        }
        return max;
    }

16.交换数组两个元素

请添加图片描述

public void swapIntegers(int[] A, int index1, int index2) {
   
        // write your code here
        if(!(A.length &
  • 3
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值