面试及牛客网刷题 死活不会的题

文章展示了使用Java实现的一些基础算法,包括质数因子分解、进制转换、字符串排序、寻找最长对称子串、整数与IP地址之间的转换、斐波那契数列计算、解决称砝码问题以及应用回溯算法。还讨论了最大子数组和及四则运算的计算方法。
摘要由CSDN通过智能技术生成

1. 质数因子分解

 n从2开始 判断,如果n %2==0,则把2添加进结果集中。

而且再次 判断n %2是否==0,如果这次不满足了,就让 n%3,等等。

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        StringBuilder result = new StringBuilder();
        String s= in.nextLine();
        int n=Integer.parseInt(s);
        int i=2;
    
        while(n>1)
        {
            //最后一个也会添加进去,因为 最后质数 5%5=0
            if(n%i==0)
            {
                result.append(i+" ");
                n=n/i;
                
            }else{
                i++;
            }
        }
        System.out.println(result.toString());
        
    }


}

2.进制转换(这题其实做出来了,利用Math.pow做,很快

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        String sh= in.nextLine();
        String r1=sh.substring(2);
        int sum=0;
        int len=r1.length()-1;
        
        for(int i=len;i>=0;i--)
        { 
            char ch=r1.charAt(i);
            if(ch>='A' )
            {
                int temp=ch-'A'+10;
                sum+=temp*Math.pow(16,len-i);
            }else if(ch>='0'&& ch<='9'){
                int temp=ch-'0';
                sum+=temp*Math.pow(16,len-i);

            }

        }
        System.out.println(sum);
        
    }
}

3.按照字典给每个单词排序

这题真的  得用API。

Arrays.sort(数组,比较器),里面放比较器,重写compareTo 方法。String的compareTo已经按照字典比较了。

o1.compareTo(o2),是升序比较。

import java.util.Scanner;
import java.util.Arrays;
import java.util.Comparator;
public class Main{
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
         int a=in.nextInt();
         in.nextLine();
         String [] ss =new String[a];
         int index=0;
         while(in.hasNext())
         {
            String temp =in.nextLine();
            ss[index++]=temp;
         }
         Arrays.sort(ss,new Comparator<String>(){
            //这个compare方法没有提示,必须得自己重写
             public int compare(String o1,String o2)
             {
                return o1.compareTo(o2);
             }
            
         });
         for(String s:ss)
         {
            System.out.println(s);
         }

    }
}

也可以直接用sort对 String数组排序

import java.util.Scanner;
import java.util.Arrays;
import java.util.Comparator;
public class Main{
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
         int a=in.nextInt();
         in.nextLine();
         String [] ss =new String[a];
         int index=0;
         while(in.hasNext())
         {
            String temp =in.nextLine();
            ss[index++]=temp;
         }
         Arrays.sort(ss);
         for(String s:ss)
         {
            System.out.println(s);
         }

    }
}

4.字符串排序

 

 这题很精妙,看代码感受思路。

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        String str= in.nextLine();
        List<Character> list =new ArrayList<>();

        for(Character ch :str.toCharArray())
        {
            //先把所有英文字母加list集合
            if(Character.isLetter(ch))
            {
                list.add(ch);
            }
        }
        //然后对list集合里得元素排序。重写一个比较器
        list.sort(new Comparator<Character>(){
            public int compare(Character o1,Character o2)
            {
                //这里的比较规则是,比较它俩的小写状态
                return Character.toLowerCase(o1)-Character.toLowerCase(o2);
            }

        });
        //然后重新填写一个字符串。碰到英文的,用list里的,碰到其他符号照抄。
        StringBuilder sb= new StringBuilder();
        int index=0;
        for(int i=0;i<str.length();i++)
        {
            if(Character.isLetter(str.charAt(i)))
            {
                  sb.append(list.get(index));
                  index++;
            }else{
                sb.append(str.charAt(i));
            }
        }
        System.out.println(sb.toString());
        
        
    }
}

5.求最长对称子串的长度

暴力破解方法

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        //求最长对称子串,双指针其实可以做
        String s= in.nextLine();
        char [] ch =s.toCharArray();
        int maxLen=0;
        //直接学冒泡排序那样 穷举出能构成的所有字符串
        for(int i=0;i<ch.length-1;i++)
        {
            for(int j=i+1;j<ch.length;j++)
            {
                String temp =s.substring(i,j+1);
                if(isDuicheng(temp))
                {
                    maxLen=Math.max(temp.length(),maxLen);
                }
            }
        }
        System.out.println(maxLen);


    }

    //写一个判断是否对称的函数
    public static   boolean  isDuicheng(String s)
    {
        if(s.length()==1) return true;
        char [] ch = s.toCharArray();
        int i=0;
        int j=ch.length-1;
        while(j>=i)
        {
            if(ch[i]!=ch[j])
            {
                return false;
            }
            i++;
            j--;

        }
        return true;
        
    }
}

对成轴做法,比较省时间。

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        //求最长对称子串,双指针其实可以做
        String s= in.nextLine();
        char [] ch =s.toCharArray();
        int maxLen=1;
        //单对称
        for(int i=1;i<ch.length-1;i++)
        {     
            maxLen=Math.max(maxLen,isDuicheng1(s,i));   
        }
        //双对称
         for(int i=1;i<ch.length;i++)
        { 
            if(ch[i]==ch[i-1])
            {
                maxLen=Math.max(maxLen,isDuicheng2(s,i-1,i));
            }
        }  
        System.out.println(maxLen);
    }
    //对称轴为一个时
    public static   int  isDuicheng1(String s ,int mid)
    {
        int i=mid-1;
        int j=mid+1;
        int len=1;
        while(i>=0 && j<=s.length()-1)
        {
            if(s.charAt(i)==s.charAt(j))
            {
                i--;
                j++;
                len+=2;
            }else{
                return len;
            }
        }
         return len;       
    }
    //轴为两个时。
    public static   int  isDuicheng2(String s ,int i,int j)
    {
        int len=0;
        while(i>=0 && j<=s.length()-1)
        {
            if(s.charAt(i)==s.charAt(j))
            {
                i--;
                j++;
                len+=2;
            }else{
                return len;
            }
        }
         return len;       
    }
}

6.整数和ip地址的转换

 学到了,

1. Integer.parseint(字符串,2) 可以把字符串里的内容,从2进制的形式转换到10进制。

2.这种32位二进制转成整数,必须得用long 类型来接受。

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        String s1=in.nextLine();
        String s2=in.nextLine();
        String result2=change2(s2);
        System.out.println(change1(s1));
        System.out.println(result2);
   
    }

    //第一种转换
    public static long change1(String s)

    {
        String [] ss= s.split("\\.",4);
        //补全
        String result="";
        for(String temp:ss)
        {
            Integer a=Integer.valueOf(temp);
            String Bs =Integer.toBinaryString(a);
            if(Bs.length()<8)
            {
                Bs=buquan(Bs,8);
            }
            result+=Bs;
        }
        //最终转换的整数必须得是long,因为这个数字超过int的最大值。
        long a=Long.parseLong(result,2);
        return a;
     

    }
    //第二种转换
    public static String change2(String s)

    {
        long a=Long.parseLong(s);
        String result="";

        StringBuilder sb= new StringBuilder();
        String temp=Long.toBinaryString(a);
        //这里需要补全 32位,然后再按每8位来分割
        String Bs=buquan(temp,32);
        for(int i=0;i<32;i++)
        {
          sb.append(Bs.charAt(i));
          if((i+1)%8==0 && i!=31)
          {
            int num1=Integer.parseInt(sb.toString(),2);
            
            result+=num1+".";
            sb=new  StringBuilder();

          }else if(i==31) 
          {
            int num1=Integer.parseInt(sb.toString(),2);
 
            result+=num1;
          }
        }
         return result;
    }
    public static String buquan(String s,int num)
    {
        int len=s.length();
        String result="";
        if(len<num)
        {
            int left=num-len;
            while(left>0)
            {
                result+="0";
                left--;
            }
            result+=s;

        }else{
            return s;
        }
        return result;
    }
}

7.打印蛇形矩阵

这样斜着打印。

 生成数组的代码过程为:

for(int k=0;k<n;k++)
        {
            int i=0;
            int j=k;
            
            while(i<n &&j>=0)
            {
                a[i][j]=sum;
                sum++;
                i++;
                j--;       
            }
        }

打印数组的过程为:

注意每行的最后一个的情况,它打印完了还得换行。

        for(int j=0;j<n;j++)
        {
          for(int i=0;i<n;i++)
          {
            if(a[i][j]!=0 && i!=n-1)
            {
                System.out.print(a[i][j]);
                System.out.print(" ");

            }else if(a[i][j]!=0 && i==n-1)
            {
                 System.out.print(a[i][j]);
                 System.out.println();
                 break; 
            }
            else {
                System.out.println();
                break;    
            }

          }

        }

8.统计每个月兔子的个数(斐波那契数列)

 

兔子过两个月就可以生出新兔子。

那为什么新增是两个月前兔子的总量呢?

因为:过了两个月了,两个月前的兔子已经都能成熟到每个月都能生产。

可以推导出当前月份兔子的个数f(n)为:上个月兔子的个数+两个月前兔子的个数

即  f(n)=f(n-1) +f(n-2)。

9.称砝码

给 n个砝码, 和他们的重量,还有他们的个数。

求 这些砝码能组成多少个重量数?

10. 有n个数组(没有重复元素),每个数组拿一个元素出来,最终凑成长度为n的字符串,求能凑成多少个字符串。

学会一种新的穷举方法(回溯)




    void travel(int k,String s,String [] ss,int starIndex)
    {
        if(sb.length()==k)
        {
            result.add(sb.toString());
            return ;
        }
        //startIndex表示 我们要 操作下标为startIndex的数组。
        int a= s.charAt(starIndex)-'0';
        String temp =ss[a];//temp是我们拿到的这个字符数组。

         //然后我们如此回溯,在for里完成temp数组的 元素添加,删除。
       
        for(int i=0;i<temp.length();i++)
        {
            sb.append(temp.charAt(i));
            //travel到下一个数组
            travel(k,s,ss,starIndex+1);
            sb.deleteCharAt(sb.length()-1);
        }
     
    }

11.最大子数组和

用sum来记录。

如果 发现前面的和为0了,那就把sum变成0,重新从这一位加。

class Solution {
    public int maxSubArray(int[] nums) {

         //sum和max都赋予初始值
        int sum=nums[0];
        //sum用来记录子数组的连续和,如果sum<0了,那就舍之前所有的元素,重新开始添加。
        int max=nums[0];
        for(int i=1;i< nums.length;i++)
        {
            if(sum<0)
            {
               sum=0; 
            }
            sum+=nums[i];

            max=Math.max(sum,max);
        }
        return max;
    }
}

12.四则运算

是用栈实现的,但具体怎么实现的我还真不知道。

这是中缀表达式,计算比较麻烦,建议转成后缀表达式。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值