算法Day1

 算法第一天加油!!!

一、点击消除(栈)

问题描述

牛牛拿到一个字符串,每次 “点击” 可消除相邻两个相同字母,如字符串 "abbc" 点击后生成 "ac",但相同而不相邻、不相同的相邻字母不可消除。目标是将字符串变得尽可能短,求最终形态。

思想

利用栈的压栈出栈操作,这里使用StringBuilder模拟栈。遍历字符串,当当前字符与栈顶字符相同时,弹出栈顶字符(即消除);否则,将当前字符压入栈。

代码实现

package Day1;

import java.util.Scanner;

/**

 * 问题描述:点击消除(栈)

 * 牛牛拿到了一个字符串。

 * 他每次点击,可以把字符串中相邻两个相同字母消除,例如,字符串"abbc"点击后可以生成"ac"

 * 但相同而不相邻、不相同的相邻字母都是不可以被消除的。

 * 牛牛想把字符串变得尽可能短。他想知道,当他点击了足够多次之后,字符串的最终形态是什么?

 * 思想:利用栈 压栈出栈 使用StringBuilder模拟栈操作

 */

public class clickClear {

    public static void main(String[] args) {

        Scanner in = new Scanner(System.in);

        char[] s = in.next().toCharArray();

        StringBuilder st = new StringBuilder();

        for(int i = 0; i < s.length; i++)

        {

            char ch = s[i];

            if(st.length() != 0 && ch == st.charAt(st.length() - 1))

            {

                st.deleteCharAt(st.length() - 1);

            } else

            {

                st.append(ch);

            }

        }

        System.out.println(st.length() == 0? 0 : st.toString());

    }

}

重点解析

  1. 输入处理:通过Scanner获取用户输入的字符串,并将其转换为字符数组char[] s
  2. 栈的模拟:使用StringBuilder st作为栈,利用length()方法判断栈是否为空,charAt(st.length() - 1)获取栈顶字符。
  3. 核心逻辑:遍历字符数组,当栈非空且当前字符与栈顶字符相同时,使用deleteCharAt(st.length() - 1)删除栈顶字符(模拟出栈);否则,使用append(ch)将当前字符添加到StringBuilder(模拟压栈)。
  4. 输出结果:若最终栈为空,输出 0;否则,输出栈中剩余的字符串,即最终形态。

二、两个数组的交集

问题描述

给定两个整数数组nums1nums2,找到它们的公共元素并返回。数据范围:1<=len<=1000,1<=nums [i]<=1000。

方法一:使用 hash 思想,使用 boolean 数组模拟 hash 数组

代码实现

package Day1;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.HashSet;

/**

 * 描述:两个数组的交集

 * 给定两个整数数组分别为nums1,nums2,找到它们的公共元素并按返回。

 * 数据范围:1<=len<=1000 1<=nums[i]<=1000

 * 方法一:使用hash思想使用boolean数组模拟hash数组

 * 方法二:直接通果修改原数组,利用链表的函数

 */

public class intersectionArray {

    public ArrayList intersection1 (ArrayList nums1, ArrayList nums2) {

        boolean[] hash = new boolean[1010];

        for(int x:nums1){

            hash[x] = true;

        }

        ArrayList ret = new ArrayList<>();

        for(int x:nums2){

            if(hash[x]){

                ret.add(x);

                hash[x] = false;

            }

        }

        return ret;

    }

重点解析

  1. hash 数组初始化:创建一个长度为 1010 的boolean数组hash,用于标记数字是否在nums1中出现过。
  2. 标记 nums1 中的数字:遍历nums1,将其中出现的数字在hash数组中对应位置标记为true
  3. 寻找交集:遍历nums2,若当前数字在hash数组中对应位置为true,则将其添加到结果ArrayList中,并将hash数组中对应位置标记为false,防止重复添加。

方法二:直接通过修改原数组,利用链表的函数

代码实现

    public ArrayList intersection2(ArrayList nums1, ArrayList nums2) {

        ArrayList list=new ArrayList();//1.创建一个list集合 用于保存两个数组的交集

        for(int i=0;i循环其中一个数组

            if(nums2.contains(nums1.get(i))){//3.如果nums1中的元素在nums2中存在,符合条件需要将该元素存入list集合

                while(nums2.remove(nums1.get(i)));//4.循环删除某数组中的相同值,防止后面重复添加

                list.add(nums1.get(i));//5.添加元素

            }

        }

        return list;

    }

}

重点解析

  1. 结果集合创建:创建一个ArrayList list用于存储交集元素。
  2. 遍历与判断:遍历nums1,使用numscontains(nums1.get(i))判断nums1中的元素是否在nums2中存在。
  3. 去重与添加:若存在,则通过while(nums2.remove(nums1.get(i)));循环删除nums2中所有相同元素,防止重复添加,然后将该元素添加到结果集合list中。

三、数字统计

问题描述

统计给定范围 [L, R] 的所有整数中,数字 2 出现的次数。例如,范围 [2, 22] 中,数字 2 在数 2 中出现 1 次,12 中出现 1 次,20 中出现 1 次,21 中出现 1 次,22 中出现 2 次,共出现 6 次。

代码实现

package Day1;

import java.util.Scanner;

/**

 * 题目描述:数字统计

 * 请统计某个给定范围[L, R]的所有整数中,数字2出现的次数。

 * 比如给定范围[2, 22],数字2在数2中出现了1次,在数12中出现1次,在数20中出现1次,在数21中出现1次,在数22中出现2次,所以数字2在该范围内一共出现了6次。

 * 输入描述:

 * 输入共1行,为两个正整数 L R,之间用一个空格隔开。

 * 输出描述:

 * 输出共1行,表示数字2出现的次数。

 */

public class numberStatistics {

    public static void main(String[] args) {

        Scanner in = new Scanner(System.in);

        int L = in.nextInt(), R = in.nextInt();

        int ret = 0;

        for(int i = L; i <= R; i++)

        {

            int tmp = i;

            while(tmp != 0)

            {

                if(tmp % 10 == 2) ret++;

                tmp /= 10;

            }

        }

        System.out.println(ret);

    }

}

重点解析

  1. 输入获取:通过Scanner获取用户输入的范围LR
  2. 遍历范围:使用for循环遍历从LR的每一个整数i
  3. 数字分解与统计:对于每个整数i,通过while循环不断对其进行取余和整除操作(tmp % 10获取个位数字,tmp /= 10去掉个位数字),若个位数字为 2,则结果计数器ret加 1。
  4. 输出结果:最终输出ret,即数字 2 在给定范围内出现的总次数。  

你可能感兴趣的:(算法学习,java,算法)