有意思的暴力解法专题(持续更新)

例题1:给你一个字符串 s,找到 s 中最长的回文子串。(力扣:5)
在这里插入图片描述
代码级细节如下:

//暴力解法:双重for循环,并使用一个全局变量来记录最长的长度
//宣告失败太多特殊情况了,处理不过来
//看了看题解我觉得我又行了,原来我这种方法叫中心扩散法:
class Solution {
    int maxlen=0;
    public String longestPalindrome(String s) {
        int str=0;
        int end=0;
        // 从每个字符开始两侧计算回文字符串的长度
        int len=s.length();
        // 将字符串转化为数组
        char[] arr=s.toCharArray();
        for(int i=0;i<len;){
            int l=i;
            int r=i;
        //如果剩余子串长度小于目前查找到的最长回文子串的长度,直接终止循环
        // (因为即使他是回文子串,也不是最长的,所以直接终止循环,不再判断)
        if (len - i <= maxlen / 2)
            break;
        // 首先要避免一串字符串都是重复字符串的情况
        //这一步也很精华
             while(r<len-1&&arr[r]==arr[r+1]){
                 r++;
             }
            //  下一次的中心节点变为不重复节点的第一个节点
            i=r+1;
            // 判断回文字符串,卧槽这里太关键了,它是先判断是否相等,然后再移动l,r
             while(l>0&&r<len-1&&arr[l-1]==arr[r+1]){     
                     l--;
                     r++;
             } 
            if(maxlen<r-l+1){
                 maxlen=r-l+1;
                 str=l;
                 end=r;
             }
             }
              return s.substring(str,str+maxlen);
        }  
    }

例题2: 有两种特殊字符:

第一种字符可以用一个比特 0 来表示
第二种字符可以用两个比特(10 或 11)来表示、
给定一个以 0 结尾的二进制数组 bits ,如果最后一个字符必须是一位字符,则返回 true 。(leetcode:717)
在这里插入图片描述

// 看别人的题解一看就会,自己一点思路都没有
// 思路大概是这样的:因为如果是以1开始的肯定会和其后面的字符组成两比特字符
// 如果是以0为起点的就只能是1比特字符,所以可以从前往后遍历,判断是否能遍历到
// n-1的地方的时候,刚好前面的字符都组成字符
class Solution {
    public boolean isOneBitCharacter(int[] bits) {
     int i=0;
     while(i<bits.length-1){
         if(bits[i]==1){
             i=i+2;
         }else{
             i++;
         }
     }
    //  判断i最后的位置是在哪里
    if(i==bits.length-1){
        return true;
    }
    return false;
    }
}

例题3: 马虎的算式(五个for循环枚举问题)

题目:小明是个急性子,上小学的时候经常抄错题目。有一次老师出的36X495=?他却抄成了396X45?但结果却很戏剧性,他的答案是正确的!!因为36

  • 495= 396 * 45=17280

类似这样的巧合可能还有很多,比如27 * 594=297 * 54。

假设a b c d e代表1~9不同的五个数字(注意是各不相同的数字,且不含0),能满足

这样的格式的式子总共有多少种?

package one;

public class None_2 {
   public static void main2(String[] args) {
	   int count=0;
//	   5个for循环我想都不敢想
	   for(int a=1;a<=9;a++) {
		   for(int b=1;b<=9;b++) {
			   if(a==b) continue;
			   for(int c=1;c<=9;c++) {
				   if(a==c||b==c) continue;
				   for(int d=1;d<=9;d++) {
					   if(a==d||b==d||c==d) continue;
					   for(int e=1;e<=9;e++) {
						   if(a==e||b==e||c==e||d==e) continue;
						   if((a*10+b)*(c*100+d*10+e)==(a*100+d*10+b)*(c*10+e)) {
							   count++;
						   }
					   }
				   }
			   }
		   }
	   }
	   System.out.print(count);
   }
}

例题4: 立方变自身(简单枚举)
题目:观察下面的现象,某个数字的平方,按位累加仍然等于自身

    1^3=1

    8^3=512        5+1+2=8

    17^3=4913     4+9+1+3=17

    ...

    请你计算包括1,8,17在内,符合这个性质的正整数一共有多少个?     

这道题主要是提前知道了测试数的范围是0-100不然暴力做不出来

package one;

public class None_5 {
//	又是暴力循环的一题
   public static void main(String[] args) {
	    int count=0;
	    for(int i=1;i<=100;i++) {
	    	int sum=i*i*i;
	    	int sum2=0;
	    	while(sum!=0) {
	    		sum2=sum2+sum%10;
	    		sum=sum/10;
	    	}
	    	if(i==sum2) {
	    		count++;
	    	}
	    }
	    System.out.print(count);
   }
}

例题5: 饮料换购

饮料厂举办一次促销优惠活动,乐羊羊C型饮料,凭3个瓶盖可以再换一瓶C型饮料,并且可以一直循环下去(但不允许暂借或赊账)。请你计算一下,如果小明不浪费瓶盖,尽可能地参加活动,那么,对于他初始买入的n瓶饮料最后他一共能喝到多少瓶饮料?

输入:一个整数n,表示开始购买的饮料数量(0<n<10000)

输出:一个整数,表示实际得到的饮料数

package two;

import java.util.Scanner;

//大一下学期就弄过了,现在就回味一下
//简单的循环题目
class Solution_two_1{
	public void solution(int n){
//		创建一个变量记录总共和了多少瓶饮料
		int count=0;
//		创建一个变量换完饮料后剩下空瓶子的个数
		int  surplus=0;
//		当饮料个数大于0,就继续循环
		while(n>0) {
//			每一轮最多喝多少饮料
			count=count+n;
			n=(n+surplus)/3;
			surplus=(n+surplus)%3;
		}
		System.out.print(count);
	}
}
public class Two_1 {
   public static void main(String[] args) {
	   Solution_two_1 a =new Solution_two_1();
//	   输入类
	   Scanner sc=new Scanner(System.in);
	   int n=sc.nextInt();											
	   a.solution(n);
   }
}

例题6: lcd算法和gcd算法:快速求最大公约数及最小公倍数

package three;

import java.util.Scanner;

//理解记忆快速求最大公约数的方法
//欧几里得算法(辗转项除法)
//在gcd算法的基础上求得最大公倍数lcd:两数之积/最大公约数
public class Three_1 {
   public static void main(String[] args) {
//	   从下面输入两个数
	   Scanner sc=new Scanner(System.in);
	   int a=sc.nextInt();
	   int b=sc.nextInt();
	   System.out.println(gcd(a,b));
	   System.out.println(lcd(a,b));
   }
//   利用递归优化的辗转相除法
   public static int  gcd(int a,int b) {
	   return b==0?a:gcd(b,a%b);
   }
// 利用gcd得出的最大的公共倍数:lcd算法
//   直接就用a,b中较大的数乘于最大公约数即可
 public static int  lcd(int a,int b) {
	   return a*b/gcd(b,a%b);
 }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值