经典题目刷一刷

目录

1.二进制的插入

2.查找组成一个偶数的最近两个素数

3.参数解析

4.跳石板


1.二进制的插入

二进制插入_牛客题霸_牛客网【牛客题霸】收集各企业高频校招笔面试题目,配有官方题解,在线进行百度阿里腾讯网易等互联网名企笔试面试模拟考试练习,和牛人一起讨论经典试题,全面提升你的技术能力https://www.nowcoder.com/practice/30c1674ad5694b3f8f0bc2de6f005490?tpId=8&&tqId=11019&rp=1&ru=/activity/oj&qru=/ta/cracking-the-coding-interview/question-ranking

①题目及示例:

 ②方法解析:

按照题目意思,待插入的那一段均为0,那么我们很容易就会想到用或运算来完成,而从哪里插入就将待插入值右移多少位即可。注意!二进制的位数从0开始由低到高。我们画一个图来进一步解释:

 ③代码如下:

import java.util.*;
public class BinInsert {
    public int binInsert(int n, int m, int j, int i) {
        // write code here
        m<<=j;
        return m|n;
    }
}

2.查找组成一个偶数的最近两个素数

查找组成一个偶数最接近的两个素数_牛客题霸_牛客网【牛客题霸】收集各企业高频校招笔面试题目,配有官方题解,在线进行百度阿里腾讯网易等互联网名企笔试面试模拟考试练习,和牛人一起讨论经典试题,全面提升你的技术能力https://www.nowcoder.com/practice/f8538f9ae3f1484fb137789dec6eedb9?tpId=37&&tqId=21283&rp=1&ru=/activity/oj&qru=/ta/huawei/question-ranking

①题目及示例:

 ②方法解析:

由题,我们能够分析到,本题要找的东西需要满足几个条件,一是组成偶数的数需要是两个素数,二是需要这对素数差值最小。

其中需要注意因为要使差值最小,且数据都是成对出现,那么最小的差值,必定是离中间最近的地方,所以我们直接从中间来开始搜寻判断是不是素数。

③代码如下:

import java.util.*;
public class Main {
 public static void main(String[]args){
     Scanner sc=new Scanner(System.in);
 while(sc.hasNext()){
     int n=sc.nextInt();
     int mid=n/2;
     for(int i=mid;i>0;i--){
         if(isPrime(i)&&isPrime(n-i)){
             System.out.println(i);
             System.out.println(n-i);
             break;
         }
     }
 }
 }//写一个函数判断它是不是素数
    public static boolean isPrime(int n){
        for(int i=2;i<=Math.sqrt(n);i++){
            if(n%i==0){
                return false;
            }
        }
        return true;
    }
}

3.参数解析

参数解析_牛客题霸_牛客网【牛客题霸】收集各企业高频校招笔面试题目,配有官方题解,在线进行百度阿里腾讯网易等互联网名企笔试面试模拟考试练习,和牛人一起讨论经典试题,全面提升你的技术能力https://www.nowcoder.com/practice/668603dc307e4ef4bb07bcd0615ea677?tpId=37&&tqId=21

①题目及示例:

 ②方法解析:

首先我们这里先继续带大家理解一下题目的意思,这里的意思是,以空格为分界表示一个字符串,一对引号为特殊情况,这对引号汇聚的整体表示一个字符串(因此引号内的空格不需要进行分割)。进行计数。并且还要将每个部分输出,注意,引号部分输出的时候不加引号。解题的话主要就是灵活运用循环和条件语句的操作。直接上代码。

③代码如下:

import java.util.*;
public class Main {
 public static void main(String[]args){
     Scanner sc=new Scanner(System.in);
     String str=sc.nextLine();
     int count=0;
     for(int i=0;i<str.length();i++){
        if(str.charAt(i)=='"'){
            do{
                i++;
            }while(str.charAt(i)!='"');
        }
         if(str.charAt(i)==' '){
             count++;
         }
     }
     System.out.println(count+1);
    //因为在引号里的空格是要打出来的,所以我们设置一个标志位flg,当其要打印引号里的值时特殊处理
    int flg=1;
for(int i=0;i<str.length();i++){
    //遇到第一个双引号,flag变为0,
    //遇到第二个双引号结束后flag重新变为1
    //只要在打印双引号中的内容的时候flag的值始终为0
    if(str.charAt(i)=='"'){
        flg^=1; 
    }
    //除了双引号和特殊空格以外的字符都要打印
    if(str.charAt(i)!=' '&&str.charAt(i)!='"'){ 
        System.out.print(str.charAt(i));
    }
 //双引号中的空格需要打印
     if(str.charAt(i)==' '&&flg==0){ 
         System.out.print(str.charAt(i));
     } //双引号外碰到空格,需要换行 
     if(str.charAt(i)==' '&&flg==1){ 
         System.out.println(); 
     }
 } 
}
}

4.跳石板

跳石板_牛客题霸_牛客网【牛客题霸】收集各企业高频校招笔面试题目,配有官方题解,在线进行百度阿里腾讯网易等互联网名企笔试面试模拟考试练习,和牛人一起讨论经典试题,全面提升你的技术能力https://www.nowcoder.com/practice/4284c8f466814870bae7799a07d49ec8?tpId=85&&tqId=29852&rp=1&ru=/activity/oj&qru=/ta/2017test/question-ranking

①题目及示例:

②方法解析:根据题意,我们可以默认把每个值的数据都设置为一个默认值,每跳跃一次,在原来的基础上进行+1(将1 - M个石板看做一个结果数组stepNum,每个stepNum[i]储存着从起点到这一步最小的步数,其中0为不能到达。 从起点开始对stepNum进行遍历,先求i的所有约数(即stepNum[i]能走的步数),然后更新那 几个能到达的位置的最小步数。如果不能到达则更新为此时位置的最小步数 + 1,如果是能到达的就更新为min(已记录的最小步数,此处的最小步数 + 1)),遍历一遍后得到结果。

a.设置一个数组来供我们记录(记录的值为跳跃对应的次数)

b.求一个数的约数

c.利用动态规划找出最小跳的次数

(我们来用一个图来进行具体的分析)

③代码如下:

import java.util.*;
public class Main{
    public static void main(String[] args) {
        Scanner sca = new Scanner(System.in);
        int n = sca.nextInt(); 
        int m = sca.nextInt(); 
//和数组下标对应这里为m+1
        int[] step = new int[m+1];
        for(int i =0;i < m+1;i++){
//设定一个初始值
            step[i] =Integer.MAX_VALUE;
        }//起始位置n为0步
        step[n] = 0;
        for(int i =n;i < m;i++) {
         //当设计2到初始值,说明并没有跳,直接进行下次循环
            if(step[i] == Integer.MAX_VALUE) {
                continue;
            }
            //求当前值的约数
            List<Integer> list = div(i);
            //j代表一次可以跳几块石板,此时j是list中的约数,本质上就是记录着跳几步
            //i代表当前石板的编号次数
            for(int j : list){
                if(i+j<=m && step[i+j] !=Integer.MAX_VALUE) {//表明在这之前已经有跳到这里的次数了
//动态规划的体现(已经有到这里的步数和下一步即将到这里的步数取最小值)
                    step[i+j] = Math.min(step[i+j],step[i]+1);
                }else if(i+j<=m) {//表明在这之前还没有跳到这里的次数,那么就记录当前次数
                    step[i+j] = step[i]+1;
                }
            }
        }//跳出循环后i+j=m;
        if(step[m]==Integer.MAX_VALUE) {//最终m处的次数若是为默认值,那么说明没有跳到这里的,失败,返回-1
            System.out.println(-1);
        }else{
            System.out.println(step[m]);
        }
    }
    //求约数
    public static List<Integer> div(int num) {
        List<Integer> list = new ArrayList<>();
        for(int i =2;i*i<=num;i++){
            if(num%i==0) {
                list.add(i);
                if(num/i!=i){//确保list中的数不重复
                    list.add(i);
                }
            }
        }
        return list;
    }
}
  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张洋洋~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值