例题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);
}
}