30天刷题计划(二)

1822bfbb1a0ae3eda8d5b4f9f84c6356.jpeg

坚持就是胜利,加油!!!

目录

1.字符串中找出最长的字符串

2.数组中出现次数超过一半的数字

 3.计算糖果

4.进制转换


1.字符串中找出最长的字符串

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

①题目及示例:

6eeaec0500ee434899daf70f199b10cf.png

 ②方法解析:

这个题主要考虑的是最终存放和暂时存放,以及如果进行更新替代。我们这里设置了两个字符串,一个用来存放临时结果,另一个用来存放最后的结果。需要注意的是,当最后一个是数字时,原来的大小可能发生改变,这个时候就需要再次比较两个字符串的大小。将大的结果赋值给最终结果所在的字符串,同时我们应当注意比较的过程中,实质上比较的是ASCLL码的值。详细过程在代码中得以体现。

代码如下:

import java.util.*;
public class Main {
     public static void main(String[] args) {
         Scanner sc=new Scanner(System.in);
         String str=sc.nextLine();
         //定义两个字符串,一个用来拼接,另一个用来展示最终的结果
         String tmp="";
         String res="";
         int i=0;
         for(i=0;i<str.length();i++){
             //判断当前是否是数字 
            if(str.charAt(i)>='0'&&str.charAt(i)<='9'){
                 //说明是数字,这个时候要进行拼接到不是数字为止
                 tmp+=str.charAt(i)+"";
             }else{//说明此时不是数字=》是字母或者符号
                 //为了迎接下一串数字串,我们需要把之前的进行比较,把较长的保留到最后的字符串结果中
                 if(res.length()<tmp.length()){
                     res=tmp;
                 }else{ //放置好的同时,我们要把暂时存储的置为0,以便后续的放入
                 tmp="";
                 }
             }
         }
         //当字符串最后一个数也是数字时,就有可能使大小发生改变,所以我们还需要最后再一次判断
         if(i==str.length()&&res.length()<tmp.length()){
             res=tmp;
         }
         System.out.println(res);
     }
    }

2.数组中出现次数超过一半的数字

数组中出现次数超过一半的数字_牛客题霸_牛客网【牛客题霸】收集各企业高频校招笔面试题目,配有官方题解,在线进行百度阿里腾讯网易等互联网名企笔试面试模拟考试练习,和牛人一起讨论经典试题,全面提升你的技术能力https://www.nowcoder.com/practice/e8a1b01a2df14cb2b228b30ee6a92163?tpId=13&tqId=11181&tPage=2&rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

①题目及示例:

053b867f6f4c44359bbf44adad1cee8b.png

②方法解析:

a.运用map来解决;利用Map<key,value>的特点,我们可以根据value 的次数来和数组长度的一半来进行比较。需要注意的是这里用到了一个keySet()返回此映射中包含的键的Set视图。然后将map中所有的键存入到Set集合,因为set具备迭代器,所有迭代方式取出所有的键。代码如下:

import java.util.*;
public class Solution {
    public int MoreThanHalfNum_Solution(int [] array) {
        Map<Integer,Integer>map=new HashMap<>();
        int i=0;
        for(;i<array.length;i++){
            if(!map.containsKey(array[i])){
                map.put(array[i],1);
            }else{
                map.put(array[i],map.get(array[i])+1);
            }
        }
        int len=array.length/2;
         for(Integer key : map.keySet())
        {
            if(map.get(key) > len )
            {
                return key;
            }
        }
return 0;
    }
}

 b.我们利用数组最中间的数来进行判断。我们可以很容易想到,当一个数组按从小到大排序后,那么要是中间的数不是我们要找的大于1/2数组长度的数,那么这个数就不存在,所以,我们先找到中间数的值,利用count计数,来对数组中其它数进行比较,要是与它相等,则count++,最后比较count和1/2数组的大小,来判断是否存在该数。代码如下:

import java.util.*;
public class Solution {
    public int MoreThanHalfNum_Solution(int [] array) {
        Arrays.sort(array);
        int len=array.length/2;
        int m=array[len];
        int count=0;
        for(int i=0;i<array.length;i++){
            if(array[i]==m){
                count++;
            }
        }
        if(count>=len){
            return m;
        }else{
            return 0;
        }
    }
}

c.我们利用众数来解决问题。我们都知道众数是一组数据中出现最多的数,那么要是这个众数都没有>1/2的数组长度,那么就不可能有这样的数的存在。我们采用众数,将result赋予0下标的数,要是后面的数与其相同,则count++;反之count--;当count=0时,说明该数暂时不是最终的数,我们重新赋予result新的值。要是最后count>0,则说明这样的数可能存在,再去访问数组,看这个值在数组中出现的次数是否大于1/2数组长,大于了则返回该数,反之,返回0;

import java.util.*;
public class Solution {
    public int MoreThanHalfNum_Solution(int [] array) {
      int result=array[0];
      int count=1;//此时result中的数出现一次,count记为1
        for(int i=0;i<array.length;++i){
           //保证result值不改变的前提是count!=0,所以count应该在外层
            if(count!=0){
                if(array[i]==result){
                    ++count;
                }//不等则--
                else{
                    --count;
                }
            }else{//这里是count==0
                array[i]=result;
                count=1;           
            }
        }count=0;
            for(int i=0;i<array.length;++i){
                if(array[i]==result){
                    ++count;
                }
            }
       return (count > array.length/2) ? result : 0;
    }
}

 3.计算糖果

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

①题目及示例:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5Y-N5YaF56CB6ICF,size_20,color_FFFFFF,t_70,g_se,x_16

②方法解析:(简单来说是一个判断三元一次方程组是否有解的问题)

本题主要是找规律。我们可以根据题目已知来得到四个等式,若是最后结果成立,则每个值均只能是唯一的,所以我们通过示例得到的结果等式,可以作为判断条件。之所以用B是因为B在等式中出现了四次,产生了两两对应关系。

 代码如下:

import java.util.*;
public class Main {
 public static void main(String[]args){
     Scanner sc=new Scanner(System.in);
     int a=sc.nextInt();
     int b=sc.nextInt();
     int c=sc.nextInt();
     int d=sc.nextInt();
     int A = (a+c)/2; 
     int C = (d-b)/2; 
     int B1 = (b+d)/2; 
     int B2 = (c-a)/2; 
     if(B1 != B2) { 
         System.out.print("No"); 
     }else{
         System.out.print(A+" "+B2+" "+C);
     }       
}
}

 

4.进制转换

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

①题目及示例:

236e6be2c3c643de8a17dccbefcb571f.png

 ②方法解析:

本题主要要考虑以下几个问题。

(1)负数的处理。如果该数为负数,怎么样进行处理,这里用到的是flg==-1或者置为false来进行处理。

(2)因为题目中要求了,如果N大于9,则对应的数字规则参考16进制(比如,10用A表示,等等)所以我们这里引进字符串,利用余数与下标的关系。比如余12,则在12位为C。

然后利用append函数来对末尾进行添加。

(3)如果前面为负,则在append最后添加上符号。最后反转字符串。

a.利用字符串求解:代码如下:

import java.util.*;
 class Main {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        StringBuilder sb=new StringBuilder();
        int m=sc.nextInt();
        int n= sc.nextInt();
        String ret="0123456789ABCDEF";
        //处理为负数的情况
        int flg=-1;
        if(m==0){
            System.out.println(0);
        }
        if(m<0){
            m=m*flg;
            flg=1;
        }
        while(m!=0){
            sb.append(ret.charAt(m%n));
            m/=n;
        }
        if(flg==1){
            sb.append("-");
        }
        sb.reverse();
        System.out.println(sb);
    }
}

b.在上述过程中引入栈来求,因为对于栈而言是后进先出的,所以就不用对其结果进行逆置,但是我们仍然需要对负数进行添加负号,这个的操作应该在出栈之前操作完成。代码如下:(但是这样的效率并不高,因为又创建了栈)

import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        Stack <Character>stack=new Stack<>();
        StringBuilder sb=new StringBuilder();
        int m=sc.nextInt();
        int n= sc.nextInt();
        String ret="0123456789ABCDEF";
        //处理为负数的情况 
        int flg=-1;
        if(m==0){
            System.out.println(0);
        }
        if(m<0){
            m=m*flg;
            flg=1;
        }
        while(m!=0){
           stack.push(ret.charAt(m%n));
            m/=n;
        }
         if(flg==1){
        sb.append("-");
        }
        while(!stack.isEmpty()){
    
            sb.append(stack.pop());
        }  
        System.out.println(sb);
    }
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

张洋洋~

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

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

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

打赏作者

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

抵扣说明:

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

余额充值