CodeTop算法。面试

183 阅读4分钟

1 判断三角形形状

package day0303;

import java.util.Scanner;

/**
 * @author mk
 * @description 判断三角形形状
 * @create 2022-03-2022/3/3 11:14
 */
public class Triangle {

    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入第一个数字:");
        int a = scanner.nextInt();
        System.out.println("请输入第二个数字:");
        int b = scanner.nextInt();
        System.out.println("请输入第三个数字:");
        int c = scanner.nextInt();


        Triangle test= new Triangle();
        String resource = test.checkTriangle1(a, b, c);
        System.out.println(resource);

        System.out.println("====================================");
        test.main(args);
    }




    public String  checkTriangle(int a ,int b,int c){
        String s = null;

        if(a <= 0 || b <= 0 || c <= 0){
            s = "缺少边值,无法构成三角形~!";
//            return s;
        }
        if(a+b>c && a+c>b && b+c>a){
            if(a == b || a == c || c == b){
                if(a == b && b == c){
                    s = "等边三角形~!";
                }else {
                    s = "等腰三角形~!";
                }
//                return s;
            }else{
                s = "普通三角形~!";}

        }else{
            s = "无法构成三角形~!";
        }

        return s;

    }


    public String  checkTriangle1(int a ,int b,int c){
        String s = null;

        if(a <= 0 || b <= 0 || c <= 0){
            s = "缺少边值,无法构成三角形~!";
//            return s;
        }
        if(a+b>c && a+c>b && b+c>a){
            if((a*a + b*b < c*c) || (a*a+c*c < b*b) || (c*c + b*b < a*a)){
                if(a == b || b == c || a == c){
                    s = "等腰钝角三角形~!";
                }else {
                    s = "钝角三角形~!";
                }
//                return s;
            }
           else if(a*a + b*b == c*c || a*a + c*c == b*b || c*c + b*b == a*a){
                if(a == b || b == c || a == c){
                    s = "等腰直角三角形~!";
                }else {
                    s = "直角三角形~!";
                }
            }
           //if(a*a+b*b > c*c || a*a+c*c>b*b || c*c+b*b>a*a)
           else {
                if(a == b && b == c){
                    s = "等边三角形~!";
                }else if(a == b || b == c || a == c){
                    s = "等腰锐角三角形~!";
                }else{
                    s = "锐角三角形~!";
                }
            }

        }else{
            s = "无法构成三角形~!";
        }

        return s;

    }

}

2 按升序合并如下两个 list, 并去除重复的元素

  • list1 = [2,3,5,1,3,4]
  • list2 = [6,2,3,8,1,0,2]
package day0303;

import java.util.*;

/**
 * @author mk
 * @description 按升序合并如下两个 list, 并去除重复的元素
 * list1 = [2,3,5,1,3,4]
 * list2 = [6,2,3,8,1,0,2]
 * @create 2022-03-2022/3/3 15:00
 */
public class mergeDisorder {
    public static void main(String[] args) {
        int[] list1 = {2,3,5,1,3,4};
        int[] list2 = {6,2,3,8,1,0,2};


        int[] newlist = new int[list1.length + list2.length];
        for (int i = 0; i < list1.length; i++) {
            newlist[i] = list1[i];
        }
        for (int i = 0; i < list2.length; i++) {
            newlist[list1.length - 1 + i] = list2[i];
        }

        Arrays.sort(newlist);

        Set set = new HashSet();
        for (int i = 0; i < newlist.length; i++) {
            set.add(newlist[i]);
//            System.out.print(newlist[i]);
        }

        List list = new ArrayList<>(set);
        System.out.println(list);
    }
}

3 数据库乱入。

写一个 sql,查询出成绩表中,平均分数大于 80 的所有学生信息。(表里有课程名、学生名、分数几个字段)???

/*
* select 学生表.学号姓名等等,avg(成绩) as 平均分
* from 学生表 join 成绩表 on 学生表.学号=成绩表.学号
* group by 学生表.学号
* having avg(成绩) > 80
* */

4 用栈实现队列

示例:

输入:
["MyQueue", "push", "push", "peek", "pop", "empty"]
[[], [1], [2], [], [], []]
输出:
[null, null, null, 1, 1, false]

解释:
MyQueue myQueue = new MyQueue();
myQueue.push(1); // queue is: [1]
myQueue.push(2); // queue is: [1, 2] (leftmost is front of the queue)
myQueue.peek(); // return 1
myQueue.pop(); // return 1, queue is [2]
myQueue.empty(); // return false
class MyQueue {

    Stack<Integer> inStack;
    Stack<Integer> outStack;

    public MyQueue() {

        inStack = new Stack<Integer>();
        outStack = new Stack<Integer>();

    }
    
    
    public void push(int x) {
        inStack.push(x);
    }
    
    public int pop() {
        if (outStack.isEmpty()) {
            in2out();
        }
        return outStack.pop();
    }
    
    public int peek() {
        if (outStack.isEmpty()) {
            in2out();
        }
        return outStack.peek();
    }
    
    public boolean empty() {
        return inStack.isEmpty() && outStack.isEmpty();
    }

    private void in2out() {
        while (!inStack.isEmpty()) {
            outStack.push(inStack.pop());
        }
    }

}

/**
 * Your MyQueue object will be instantiated and called as such:
 * MyQueue obj = new MyQueue();
 * obj.push(x);
 * int param_2 = obj.pop();
 * int param_3 = obj.peek();
 * boolean param_4 = obj.empty();
 */
 
package day0303;

import java.util.Stack;

/**
 * @author mk
 * @description
 * @create 2022-03-2022/3/3 16:44
 */
public class StackToQueue {
    

    public static void main(String[] args) {

    }

}

class MyQueue{
    Stack<Integer> inStack;
    Stack<Integer> outStack;

    public  MyQueue() {

        inStack = new Stack<Integer>();
        outStack = new Stack<Integer>();

    }

    //如果是添加尾部,先把栈2的内容全部放到栈1中来
    public void appendTail(int value) {
        if(inStack.empty()){
            while(!outStack.empty()){
                inStack.push(outStack.pop());
            }
        }
        inStack.push(value);
    }

    //如果是删除头部,先把栈1的内容全部放到栈2中来
    public int deleteHead() {
        if(outStack.empty()){
            while(!inStack.empty()){
                outStack.push(inStack.pop());
            }
            if(outStack.empty()){
                return -1;
            }
            else{
                return outStack.pop();
            }
        }
        return outStack.pop();
    }
}

5 队列实现栈

class MyStack {
    Queue<Integer> queue1;
    Queue<Integer> queue2;

    /** Initialize your data structure here. */
    public MyStack() {
        queue1 = new LinkedList<Integer>();
        queue2 = new LinkedList<Integer>();
    }
    
    /** Push element x onto stack. */
    public void push(int x) {
        queue2.offer(x);
        while (!queue1.isEmpty()) {
            queue2.offer(queue1.poll());
        }
        Queue<Integer> temp = queue1;
        queue1 = queue2;
        queue2 = temp;
    }
    
    /** Removes the element on top of the stack and returns that element. */
    public int pop() {
        return queue1.poll();
    }
    
    /** Get the top element. */
    public int top() {
        return queue1.peek();
    }
    
    /** Returns whether the stack is empty. */
    public boolean empty() {
        return queue1.isEmpty();
    }
}


/**
 * Your MyStack object will be instantiated and called as such:
 * MyStack obj = new MyStack();
 * obj.push(x);
 * int param_2 = obj.pop();
 * int param_3 = obj.top();
 * boolean param_4 = obj.empty();
 */

6 找出数组中重复的数字。

在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。

示例 1:

输入: [2, 3, 1, 0, 2, 5, 3]

输出:2 或 3

class Solution {//差点
    public int findRepeatNumber(int[] nums) {
        Set<Integer> set = new HashSet<Integer>();
        int repeat = -1;
        for (int num : nums) {
            boolean temp = set.add(num);          
            if (!temp) {
                repeat = num;
                break;
            }
            //else{
               // set.add(num);
           // }
        }
        return repeat;
    }
}
class Solution {//力扣官方
    public int findRepeatNumber(int[] nums) {
        Set<Integer> set = new HashSet<Integer>();
        int repeat = -1;
        for (int num : nums) {
            if (!set.add(num)) {
                repeat = num;
                break;
            }
        }
        return repeat;
    }
}

7 字符串里第一个出现重复的字符

package day0303;

import java.util.HashSet;
import java.util.Set;

/**
 * @author mk
 * @description 字符串里第一个出现重复的字符
 * @create 2022-03-2022/3/3 17:14
 */
public class RepeatChar {
    public static void main(String[] args) {
        String s = "dbbd";
        //错了。先出现的是d
//        for (int i = 0; i < str.length(); i++) {
//            for (int j = i+1; j < str.length(); j++) {
//                if(String.valueOf(str.charAt(i)).equals(String.valueOf(str.charAt(j)))){
//                    System.out.println(str.charAt(i));
//                    break;
//                }
//            }
//        }

        Set<Integer> set = new HashSet<Integer>();
        for (int i = 0; i < s.length(); i++) {
            if(! set.add((int) s.charAt(i))){
                System.out.println(s.charAt(i));
                break;
            }

        }
    }
}
package day0303;

/**
* @author mk
* @description 轩儿给的解答。优秀
* @create 2022-03-2022/3/3 19:30
*/
public class RepeatChar1 {
   public static void main(String[] args) {
       // 初始化数据
       String sourceStr = "dbbd";

       // 第一种情况是,
       // 找当前数据中谁有重复数据,
       // 其中第一个有重复数据的字符是谁
       // 例如字符串中有{d,d}{b,b}两组重复数据,但是第一个有重复数据的是d,那么答案为d

       for(int i = 0;i< sourceStr.length();i++) {
           for(int j=i+1;j<sourceStr.length();j++) {
               if(String.valueOf(sourceStr.charAt(i)).equals(String.valueOf(sourceStr.charAt(j)))) {
                   System.out.println(sourceStr.charAt(i));
                   return;
               }
           }
       }

       // 第二种情况是。
       // 当前数据在遍历过程中谁首先出现了重复数据
       // 例如
       // 输出:d   无重复
       // 输出:db  无重复
       // 输出:dbb 返发现bb重复,则当前重复字符为b
               for(int i=1;i<sourceStr.length();i++) {
                   for(int j = i - 1;j>=0;j--) {
                       if(String.valueOf(sourceStr.charAt(i)).equals(String.valueOf(sourceStr.charAt(j)))) {
                           System.out.println(sourceStr.charAt(i));
                           return;
                       }
                   }
               }
   }
}

8 反转字符串:qwww.baidu.com,输出com.baidu.wwwq

package day0303;

/**
 * @author mk
 * @description 反转字符串
 * 例如,输入 http://www.baidu.com,输出com.baidu.www//:http
 * @create 2022-03-2022/3/3 19:48
 */
public class ReverseIP {

    public static void main(String[] args) {
        String s = "qwww.baidu.com";
        int n = s.length();

        char[] arr = s.toCharArray();
        for (int i = 0; i <= (n-1)/2; i++) {
            reverse(arr,0,n-1);
        }
        int start = 0;
        for (int i = 0; i < n; i++) {

            if(arr[i] == '.'){
                reverse(arr,start,i-1);
                start = i+1;
            }
        }

        System.out.println(new String(arr));
    }
    public static void reverse(char[] arr, int left, int right) {
        while (left < right) {
            char temp = arr[left];
            arr[left] = arr[right];
            arr[right] = temp;
            left++;
            right--;
        }
    }

}

9 遍历二叉树

package day0303;

import java.util.ArrayList;
import java.util.List;

/**
 * @author mk
 * @description
 * @create 2022-03-2022/3/3 21:05
 */
public class TestTree {

    public class TreeNode {
     int val;
     TreeNode left;
     TreeNode right;
     TreeNode() {}
     TreeNode(int val) { this.val = val; }
     TreeNode(int val, TreeNode left, TreeNode right) {
         this.val = val;
         this.left = left;
         this.right = right;
     }
 }
 /*
 *      1
 *        \
 *          2
 *         /
 *      3
 * */


 /*
 * 输入:root = [1,null,2,3]
 * 输出:[1,2,3]
 * 给你二叉树的根节点 root ,返回它节点值的 前序 遍历。
* */
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<Integer>();
        preorder(root, res);
        return res;
    }

    public void preorder(TreeNode root, List<Integer> res) {
        if (root == null) {
            return;
        }
        res.add(root.val);
        preorder(root.left, res);
        preorder(root.right, res);
    }


/*
 * 输入:root = [1,null,2,3]
 * 输出:[1,3,2]
 * 给你二叉树的根节点 root ,返回它节点值的 中序 遍历。
 * */
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<Integer>();
        inorder(root, res);
        return res;
    }

    public void inorder(TreeNode root, List<Integer> res) {
        if (root == null) {
            return;
        }
        inorder(root.left, res);
        res.add(root.val);
        inorder(root.right, res);
    }

    /*
     * 输入:root = [1,null,2,3]
     * 输出:[3,2,1]
     * 给你二叉树的根节点 root ,返回它节点值的 后序 遍历。
     * */
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<Integer>();
        postorder(root, res);
        return res;
    }

    public void postorder(TreeNode root, List<Integer> res) {
        if (root == null) {
            return;
        }
        inorder(root.left, res);
        inorder(root.right, res);
        res.add(root.val);
    }


}