数据结构-力扣

目录

682. 棒球比赛

1047. 删除字符串中的所有相邻重复项

剑指 Offer 09. 用两个栈实现队列

面试题59 - II. 队列的最大值

26. 删除有序数组中的重复项

27. 移除元素

80. 删除有序数组中的重复项 II

1. 两数之和

9. 回文数

20. 有效的括号


class Solution {
    public int calPoints(String[] operations) {
        //创建一个栈,来存储实际的得分
        Stack<Integer> stack=new Stack<>();
        //定义一个String类型的变量用于存储每一个记录的数据
        String element="";
        //定义一个int类型的变量,用于返回最后的结果
        int result=0;
        //使用for循环,拿到每一次记录的字符串
        for (int i = 0; i <operations.length ; i++) {
            //将每一次记录的字符串赋值给element  
            element=operations[i];
            //使用switch判断每一次的字符串
              switch (element){
                  //如果是C,就将栈顶元素移除    
                  case "C":
                      stack.pop();
                      break;
 //如果是D,就拿到栈顶元素,定义两个局部变量存储栈顶元素和新一轮得分(前一次得分的二倍),再讲栈顶元素和新一轮得分元素入栈    
                  case "D":
                      int last=stack.pop();
                      int num=last*2;
                      stack.push(last);
                      stack.push(num);
                      break;
 //如果是+,定义三个局部变量,存储两次出栈的元素以及他们相加的结果,再以第二次出栈的元素,第一次出栈的元素,相加的结果的顺序入栈                     
                  case "+":
                      int last1=stack.pop();
                      int last2=stack.pop();
                      int newNum=last1+last2;
                      stack.push(last2);
                      stack.push(last1);
                      stack.push(newNum);
                      break;
 //除以上结果,记录的是得分,将字符串以int类型接收,再直接入栈                       
                  default:
                      int number=Integer.parseInt(element);
                      stack.push(number);
              }
        }
//对栈内的元素进行遍历输出,使用result存储最终的结果        
        while (!stack.isEmpty()){
            result+=stack.pop();
        }
//返回最后的结果        
          return result;
    }
}

1047. 删除字符串中的所有相邻重复项

class Solution {
public String removeDuplicates(String s) {
    //创建一个栈,用于存储符合条件的字符
        Stack<Character> stack = new Stack<>();
    //对字符串进行遍历,取出每一个字符
        for (int i = 0; i < s.length(); i++) {
            //如果栈为空或者当前字符和栈顶元素不相同就直接入栈
            if (stack.empty() || s.charAt(i) != stack.peek()) {
                stack.push(s.charAt(i));
            } else {
                //如果当前字符和栈顶元素相同就会将相同元素出栈
                stack.pop();
            }
        }
    //使用stringbuffer存储字符
        StringBuffer stringBuffer = new StringBuffer();
    //遍历栈,并将栈中元素添加到stringbuffer中
        while (!stack.empty()) {
            stringBuffer.append(stack.pop());
        }
    //将stringbuffer逆序并且转换为string类型返回
        return stringBuffer.reverse().toString();
    }
}

剑指 Offer 09. 用两个栈实现队列

import java.util.Stack;
​
public class CQueue {
    //定义第一个栈用于做入队操作
    Stack<Integer> stack1 = new Stack<>();
    //定义第二个栈用于出队操作
    Stack<Integer> stack2 = new Stack<>();
    public CQueue() {
    }
    //入队
    public void appendTail(int value) {
        stack1.push(value);
    }
    //出队
    public int deleteHead() {
        if(stack2.isEmpty()){
            if(!stack1.empty()){
//如果出队栈为空的话,判断入队栈不为空,就将入队栈的元素全部赋给出队栈
                while (!stack1.empty()){
                    stack2.push(stack1.pop());
                }
            }
            //出队栈为空,入队栈也为空,则返回-1
            else return -1;
        }
        //出队栈中有元素,则直接出栈
        return stack2.pop();
    }
}

面试题59 - II. 队列的最大值

import java.util.LinkedList;
import java.util.Queue;

class MaxQueue {
    Queue<Integer> queue;
    public MaxQueue() {
        //创建队列
       queue = new LinkedList<>();
    }
    public int max_value() {
        //定义一个变量存储最大值
        int mark = 0;
        if (queue.isEmpty()) {
            return -1;
        }
        for(int i:queue){
            mark=Math.max(i, mark);
        }
        return mark;
    }
    public void push_back(int value) {
   
        queue.offer(value);
    }
    public int pop_front() {
        //如果队列为空直接返回-1,不为空直接出队并且返回
        if (queue.isEmpty()) {
            return -1;
        } else return queue.poll();
    }
}

import java.util.LinkedList;
import java.util.Queue;


class MaxQueue {

    Queue<Integer> queue;
    LinkedList<Integer> linkedList ;

    public MaxQueue() {
        queue = new LinkedList<>();
        linkedList=new LinkedList<>();
    }

    public int max_value() {
        if (linkedList.isEmpty()) {
            return -1;
        }
        return linkedList.peekFirst();
    }

    public void push_back(int value) {
        queue.offer(value);
        while (!linkedList.isEmpty()) {
            if (linkedList.peekLast() < value) {
                linkedList.pollLast();
            }
            else {
                break;
            }
        }
        linkedList.offerLast(value);
    }

    public int pop_front() {
        if (queue.isEmpty()) {
            return -1;
        }
        int value = queue.poll();
        if (value == linkedList.peekFirst()) {
            linkedList.pollFirst();
        }
        return value;
    }
}


第一种:

class Solution {
     public int removeDuplicates(int[] nums) {
         //定义一个treeSet集合
        TreeSet<Integer> treeSet=new TreeSet<>();
        for (int i = 0; i <nums.length; i++) {
            //将数组中的每个元素遍历添加到集合中,treeset去重且底层能进行自然排序
            treeSet.add(nums[i]);
        }
         //定义一个遍历,用于表示数组的索引
        int index=0;
         //使用迭代器遍历集合
        Iterator<Integer>iterator=treeSet.iterator();
        while(iterator.hasNext()){
            //将集合中的元素赋值给原数组
            nums[index]=iterator.next();
            //索引自加
            index++;
        }
         //返回集合的容量
        return treeSet.size();
    }
}

第二种

class Solution {
     public int removeDuplicates(int[] nums) {
         //定义一个变量来记录最后不重复项的个数
        int num=0;
         //遍历数组
        for (int i = 1; i < nums.length; i++) {
            //如果遍历的当前项和上面定义的变量所指向的数据不相同,将将他的值赋给num+1指向的数据,并且num++
            if(nums[i]!=nums[num]){
                nums[num+1]=nums[i];
                num++;
            }
        }
         //返回不重复的个数
        return num+1;
    }
}

27. 移除元素

import java.util.*;
​
public class Solution {
    public int removeElement(int[] nums, int val) {
        int [] newArr= Arrays.stream(nums)//将传过来的数组转换为流
                       .filter(item->item!=val)//使用该方法过滤掉与指定值相等的元素
                       .toArray();//将流转换为数组
        for (int i = 0; i <newArr.length ; i++) {
            //将新数组的元素赋值给旧数组
            nums[i]=newArr[i];
        }
        //返回新数组的长度
        return newArr.length;
    }
​
    public static void main(String[] args) {
        Solution solution = new Solution();
​
    }
}

80. 删除有序数组中的重复项 II

class Solution {
   public int removeDuplicates(int[] nums) {
        int index =0;
        int num=1;
        for (int i = 1; i < nums.length ; i++) {
            if(nums[i]!=nums[index]){
                nums[index+1]=nums[i];
                num=1;
                index++;
            }else if(num>=2){
                continue;
            }else {
                nums[index+1]=nums[i];
                num++;
                index++;
            }
        }
        return index+1;
    }
}

1. 两数之和

class Solution {
    public int[] twoSum(int[] nums, int target) {
        //遍历数组
        for(int i=0;i<nums.length-1;i++){
            for(int j=i+1;j<nums.length;j++){
                //如果两个值相加结果等于预期结果
               if((nums[i]+nums[j])==target){
                   //就将角标放入一个新数组并返回
                  return new int[]{i,j};
               }
            }
        }
        //没有符合条件的返回null
        return null;
    }
}

9. 回文数

class Solution {
    public boolean isPalindrome(int x) {
        //将数值转为字符串
        String num=Integer.toString(x);
        //使用stringbuffer将字符串反转
        String revNum=new StringBuffer(Integer.toString(x)).reverse().toString();
        //返回对比的结果
       return  num.equals(revNum);
    }
}

20. 有效的括号

class Solution {
    public boolean isValid(String s) {
        //定义一个栈
        Stack<String> stack = new Stack<>();
        //遍历字符串
        for (int i = 0; i < s.length(); i++) {
            //用于存储当前的字符
            String ss = "";
            ss+=s.charAt(i);
            //如果是左括号中的一个,就入栈,并且把ss重新变为空
            if(ss.equals("[")||ss.equals("{")||ss.equals("(")){
                stack.push(ss);
                ss="";
            }else if(stack.isEmpty()){
                //如果是右括号,并且栈为空,直接返回false
                return false;
            }else {
                //如果为右括号,从栈顶获取一个左括号再加上当前的括号,判断是否为有效括号,如果是就让栈顶的左括号出栈,并且将临时存储的字符串清空,如果不是,直接返回false
                ss="";
                ss+=stack.peek();
                ss+=s.charAt(i);
                if(ss.equals("()") || ss.equals("[]") || ss.equals("{}")){
                    stack.pop();
                    ss="";
                }else
                    return false;
            }
        }
        //返回判断栈是否为空的结果
        return stack.isEmpty();
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值