首页 > 编程语言 >Java大厂面试必考真题算法篇(持续更新)十一、java 统计字符串中每个字符出现的次数

Java大厂面试必考真题算法篇(持续更新)十一、java 统计字符串中每个字符出现的次数

时间:2023-07-10 10:35:39浏览次数:34  
标签:head Java 真题 int 必考 next return ListNode public


一、写出一个程序,接受一个字符串,然后输出该字符串反转后的字符串。

答案

import java.util.*;
public class Solution {
    /**
     * 反转字符串
     * @param str string字符串 
     * @return string字符串
     */
     public String solve (String str) {
        if (str == null || str.length()==0  ) {
            return str;
        }
        return new StringBuilder(str).reverse().toString();
    }
}

二、输入一个链表,反转链表后,输出新链表的表头。

答案

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    public ListNode ReverseList(ListNode head) {
         if(head==null||head.next==null)
            return head;
        ListNode cur=head;
        ListNode pre=null;
        ListNode next=null;
        //做循环,如果当前节点不为空的话,始终执行此循环,此循环的目的就是让当前节点从指向next到指向pre
        //如此就可以做到反转链表的效果
        //先用next保存head的下一个节点的信息,保证单链表不会因为失去head节点的原next节点而就此断裂
        while(cur!=null){
            // 指向下一个位置
            next=cur.next;
            // 实际链表下一个为上一个   
            // 保存完next,就可以让head从指向next变成指向pre了,代码如下
            cur.next=pre;
            // 进行交换 指针后移
            // head指向pre后,就继续依次反转下一个节点
            // 让pre,head,next依次向后移动一个节点,继续下一次的指针反转
            pre=cur;
            cur=next;
        }
        return pre;
    }
}

三、计算并返回x的平方根(向下取整)

答案

public class Solution {
    public int sqrt(int x) {
        return (int) Math.sqrt(x);
    }
}

四、判断给定的链表中是否有环。如果有环则返回true,否则返回false

答案

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */

//遍历链表的同时,让前一个节点的next指向head(或者是任意一个指定的内存),
//在后续的遍历中,如果有节点的当前next指向了head,则说明有环。
//破坏链表,达到最快
public class Solution {
    public boolean hasCycle(ListNode head) {
        ListNode p = head;
        while(p!=null){
            ListNode aft = p.next;
            if(aft==head) 
            return true;
            p.next=head;
            p=aft;
        } 
        return false;
    }
}

快慢指针

public boolean hasCycle(ListNode head) {
        if(head==null)
            return false;
        ListNode fast=head;
        ListNode slow=head;
        while(fast!=null&&fast.next!=null){
            fast=fast.next.next;
            slow=slow.next;
            if(fast==slow)
                return true;
        }
        return false; 
    }

五、一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法

答案

public class Solution {
/**
1.假设当有n个台阶时假设有f(n)种走法。
2.青蛙最后一步要么跨1个台阶要么跨2个台阶。
3.当最后一步跨1个台阶时即之前有n-1个台阶,根据1的假设即n-1个台阶有f(n-1)种走法。
4.当最后一步跨2个台阶时即之前有n-2个台阶,根据1的假设即n-2个台阶有f(n-2)种走法。
*/
    //自顶向下,使用递归
    public int jumpFloor(int target) {
    if(target==1)
        return 1;
    else if(target==2)
        return 2;
    return jumpFloor(target-1)+jumpFloor(target-2);
    }
}

六、给定一个链表,请判断该链表是否为回文结构。

答案

import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 * }
 */

public class Solution {
    /**
     * 使用栈结构将链表入栈存一遍,等于逆序链表
       根据回文特性 正反一样 所以再出栈循环比对即可优化点,可以只比一半
     * @param head ListNode类 the head
     * @return bool布尔型
     */
    public boolean isPail (ListNode head) {
        // write code here
        if(head==null){
            return true;
        }
        Stack<ListNode> stack=new Stack<>();
        ListNode index=head;
        while(index!=null){
            stack.add(index);
            index=index.next;
        }
        index=head;
        while(index!=null){
            if(index.val!=stack.pop().val){
                return false;
            }
            index=index.next;
        }
        return true;
    }
}

七、给定一个数组,请你编写一个函数,返回该数组排序后的形式。

答案

import java.util.*;
public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 将给定数组排序
     * @param arr int整型一维数组 待排序的数组
     * @return int整型一维数组
     */
    public int[] MySort (int[] arr) {
        //调用库函数sort;
        Arrays.sort(arr);
        return arr;
    }
}

八、求给定二叉树的最大深度,最大深度是指树的根结点到最远叶子结点的最长路径上结点的数量。

答案

import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 * }
 */

public class Solution {
    /**
     * 使用栈结构将链表入栈存一遍,等于逆序链表
       根据回文特性 正反一样 所以再出栈循环比对即可优化点,可以只比一半
     * @param head ListNode类 the head
     * @return bool布尔型
     */
    public boolean isPail (ListNode head) {
        // write code here
        if(head==null){
            return true;
        }
        Stack<ListNode> stack=new Stack<>();
        ListNode index=head;
        while(index!=null){
            stack.add(index);
            index=index.next;
        }
        index=head;
        while(index!=null){
            if(index.val!=stack.pop().val){
                return false;
            }
            index=index.next;
        }
        return true;
    }
}

九、给出一个整数数组,请在数组中找出两个加起来等于目标值的数。

你给出的函数twoSum 需要返回这两个数字的下标(index1,index2),需要满足 index1 小于index2.。注意:下标是从1开始的

假设给出的数组中只存在唯一解

例如:

给出的数组为 {20, 70, 110, 150},目标值为90
输出 index1=1, index2=2

答案

public class Solution {
	   public static int[] twoSum (int[] numbers, int target) {
           int[] result = new int[2];
           for(int i = 0; i < numbers.length; i++) {
               for(int j = i+1; j < numbers.length; j++) {
                   if(numbers[i] + numbers[j] == target) {     
                	   //下标从1开始的所以+1
                       result[0] = i + 1;
                       result[1] = j + 1;
                   }
               }
           }
           return result;
       }
    public static void main(String[] args) {
		int[] num={20, 70, 110, 150};
		int[] result=twoSum(num,90);
		System.out.println(result[0]);
		System.out.println(result[1]);
	}
}

十、JAVA实现两个线程交易打印奇数偶数。

答案

public class ThreadTest implements Runnable {

    private static int i = 1;
    //synchronized锁对象
    private final Object o = new Object();

    @Override
    public void run() {
        while (i <= 100) {
            synchronized (o) {
                System.out.println("我是" + Thread.currentThread().getName() + ",我打印出了" + i++);
                //打印完成之后 唤醒另外一个线程
                o.notify();
                try {
                    //唤醒另外一个线程之后,调用wait() 释放synchronized锁 并进入blocking状态
                    //只有这样才能保证另外一个线程能获取到synchronized锁 并往下执行 实现交替打印
                    o.wait();
                } catch (InterruptedException e) {
                    System.out.println("ERROR");
                }
            }
        }
    }

    public static void main(String[] args) {
        ThreadTest t = new ThreadTest();
        Thread thread1 = new Thread(t, "线程1");
        Thread thread2 = new Thread(t, "线程2");
        thread1.start();
        thread2.start();
    }

}

十一、java 统计字符串中每个字符出现的次数

答案

  1. 将字符串转换为字符数组
  2. 定义双列集合,存储字符串中字符和字符出现次数
  3. 遍历数组拿到每一个字符,并存储在集合中(存储过程需要做判断,如果集合中不包含这个键,键的值就为1,如果包含,键的值就在原来基础上加1)
import java.util.HashMap;
import java.util.Scanner;
public class vowel {
	public static void main (String args[]){
		Scanner input = new Scanner(System.in);
		String s = input.nextLine();
		//将字符串转换成字符数组
		char[] arr = s.toCharArray();
		//定义双列集合,存储字符串字符以及字符出现的次数
		HashMap<Character,Integer> hm = new HashMap<>();
		
		for(char c:arr){
			//如果集合中不包含这个键,就将该字符当作键,值为1存储,如果集合中包含这个键,就将值增加1存储
			if(!hm.containsKey(c))      
				hm.put(c, 1);
			else
				hm.put(c,hm.get(c)+1);  
		}
		
		for (Character key : hm.keySet())     //hm.keySet()代表所有键的集合
			System.out.println(key + "=" + hm.get(key));    //hm.get(key)根据键获取值

	}

}

十二、用两个栈实现队列

答案

public class Solution {
    Stack<Integer> stack1 = new Stack<Integer>();
    Stack<Integer> stack2 = new Stack<Integer>();
    //压栈
    public void push(int node) {
        stack1.push(node);
    }
    //弹栈
    public int pop() {
        //将第一个栈中内容弹出放入第二个栈中
        while(!stack1.isEmpty()){
            stack2.push(stack1.pop());            
        }
        //第二个栈栈顶就是最先进来的元素,即队首
        int result=stack2.pop();
        //再将第二个栈的元素放回第一个栈
        while(!stack2.isEmpty()){
            stack1.push(stack2.pop());
        }
        return result;
    }
}

标签:head,Java,真题,int,必考,next,return,ListNode,public
From: https://blog.51cto.com/kero99/6674347

相关文章

  • java使用百度翻译接口实现前后端翻译功能
    java 百度翻译工具类 分别有前端和后端的 例子及工具使用百度翻译接口需要网上申请key,代码里面有URL。packagecn.secure.util;importjava.io.BufferedReader;importjava.io.Closeable;importjava.io.IOException;importjava.io.InputStream;importjava.io.InputStrea......
  • java 线程等待和唤醒方法
    java线程状态变迁图从图中可以看出Java线程等待方法是将线程从Runnable状态转换为Waiting状态,Java线程的唤醒方法是将线程从Waiting状态唤醒进入Runnable状态在Java中线程的等待和唤醒主要是分为3组:Object.wait()和Object.notify()LockSupport.park()和LockSupport.unp......
  • Java自签名证书的信任处理
    一、概要1.问题的由来该问题是由于Java访问的域名是https且使用了自签名证书,Java客户端无法验证证书的合法性,进而报出异常。该问题有以下解决思路:a.在Java客户端忽略证书的校验,这种方式适用于自己掌握Code的情况,且客户端服务端处于互相信任的环境中;b.将服务端的自签名证......
  • 【java】数组的常用操作
    sortstaticvoidsort(int[]a):将a数组按照从小到大进行排序staticvoidsort(int[]a,intfromIndex,inttoIndex):将a数组的[fromIndex,toIndex)部分按照升序排列staticvoidsort(Object[]a):根据元素的自然顺序对指定对象数组按升序进行排序。static<T>voidsort(T......
  • 暗黑2能用Java开发?还能生成APP?
    最近烧哥发现个宝藏项目,竟然用Java开发了暗黑2出来。众所周知,暗黑2是暴雪开发的一款经典游戏,距今虽有20多年,仍然有很多粉丝。粉丝延续热情的方式有很多,一种是做Mod,比如魔电,对怪物、技能、物品、场景、甚至游戏机制都有大改,目前还在定期更新,并有战网提供。另一种是纯怀旧,用另......
  • Java虚拟机(JVM):第四幕:自动内存管理 - 经典垃圾收集器
    前言:如果说收集算法是内存回收的方法论,那么垃圾收集器则是内存回收的实践者。整哥Java堆:FullGC。1、Serial收集器:最基础、历史最悠久的收集器,这是一个单线程工作的收集器。2、ParNew收集器:是Serial收集器的多线程并行版本,可以说是跟Serial完全一样。CMS收集......
  • 开心档之Java 测验
    目录Java测验 Java测验Java测验技术文档Java测验是一种衡量Java编程水平的测试,可以通过一系列问题和编程任务来测试Java开发人员的技能水平和理解程度。Java测验可以用于聘用程序员、衡量编程实践水平和掌握Java的程度。Java测验通常涵盖以下主题:基本语法-测试Ja......
  • Java - JavaWeb - Concepts
    1.Servlet配置1.1.配置父级项目配置好IntellijIDEA/MAVEN之后, 创建一个新项目com.crevew.javaweb-02-servlet,然后删除所有的SRC(方便接下来创建servlet模块);然后更新最外面的父pom.xml,加上<projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.......
  • String内存模型和Java常用方法
    一、String内存模型1、直接赋值创建string对象内存原理:StringTable(串池):字符串常量池,用来存储字符串,只能是在直接赋值中使用才会存在串池当中(JDK7前串池是在方法区里面,StringTable(串池)在JDK7版本开始从方法区中挪到了堆内存,但是运行机制没有发生变化)eg:首先mian方法进栈,创建变......
  • 面试类-Java基础 (三)
    String是Java基本数据类型吗?可以被继承吗?String是Java基本数据类型吗?不是。Java中的基本数据类型只有8个:byte、short、int、long、float、double、char、boolean;除了基本类型(primitivetype),剩下的都是引用类型(referencetype)。String是一个比较特殊的引用数据类型......