【LeetCode】125. 验证回文串(给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。)、202. 快乐数、258. 各位相加

125. 验证回文串
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。

示例 1:
输入: "A man, a plan, a canal: Panama"
输出: true
示例 2:
输入: "race a car"
输出: false

分析:
双指针i、j,一个从前往后遍历,一个从后往前遍历,用a、b记录i、j所指字符的ASCII值,当所指字符为大写字母时,将其转为小写字母的ASCII值(加32),
判断a、b是否是在小写字母或数字的ASCII值范围内,是则判断a是否等于b,不等于返回false,等于时i指针加一,j指针减一,
接着判断a是否超出范围,是则i指针加一;判断b是否超出范围,是则j指针减一,
直到i不小于j跳出循环,返回true。

代码:

public class LeetcodeTest {
	public static void main(String[] args) {
		Solution So = new Solution();
		String s = "A man, a plan, a canal: Panama";
		System.out.println(So.isPalindrome(s));
	}
}
class Solution {
    public boolean isPalindrome(String s) {
        int i = 0;
        int j =s.length()-1;
        while(i<j){
        	int a = (int)s.charAt(i);
        	int b = (int)s.charAt(j);
        	if(65<= (int)s.charAt(i) && (int)s.charAt(i)<=90){
        		a += 32;
        	}
        	if(65<= (int)s.charAt(j) && (int)s.charAt(j)<=90){
        		b += 32;
        	}
        	if(((48<= a && a<=57) || (97<= a && a<=122)) && ((48<= b && b<=57) ||(97<= b && b<=122))){
        		if(a != b){
        			return false;
        		}else{
        			i++;
        			j--;
        		}	
        	}
        	if(48> a || (57<a && a<97) || a>122){
        		i++;
        	}
        	if(48> b || (57<b && b<97) || b>122){
        		j--;
        	}	
        }
        return true;
    }
}

202. 快乐数
编写一个算法来判断一个数是不是“快乐数”。
一个“快乐数”定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,
然后重复这个过程直到这个数变为 1,也可能是无限循环但始终变不到 1。如果可以变为 1,那么这个数就是快乐数。

示例: 
输入: 19
输出: true
解释: 
1^2 + 9^2 = 82
8^2 + 2^2 = 68
6^2 + 8^2 = 100
1^2 + 0^2 + 0^2 = 1

分析:
无限循环按照题目所给的方法计算,当计算结果为1时返回true,
返回false的条件是计算结果为4,因为只要陷入4 → 16 → 37 → 58 → 89 → 145 → 42 → 20 → 4这个循环,
就为不快乐数。

代码:

public class LeetcodeTest {
	public static void main(String[] args) {
		Solution So = new Solution();
		int n = 2;
		System.out.println(So.isHappy(n));
	}
}
class Solution {
    public boolean isHappy(int n) {
    	int t = n;
    	int sum = 0;
    	while(true){
    		while(t != 0){
            	sum += ((t%10)*(t%10));
            	t /= 10;
            }
            if(sum == 1){
            	return true;
            }else if(sum == 4){
            	return false;
            }else{
            	t = sum;
            	sum = 0;
            }
    	}
    }
}

258. 各位相加
 给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。
示例:
输入: 38
输出: 2 
解释: 各位相加的过程为:3 + 8 = 11, 1 + 1 = 2。 由于 2 是一位数,所以返回 2。
进阶:
你可以不使用循环或者递归,且在 O(1) 时间复杂度内解决这个问题吗?

分析:
方法一:
循环法或递归法,直到各位相加结果是一位数返回。
方法二:
余九法:一个数对九取余,得到的数称之为九余数;一个数的九余数等于它的各个数位上的数之和的九余数。

代码:

public class LeetcodeTest {
	public static void main(String[] args) {
		Solution So = new Solution();
		int num = 38;
		System.out.println(So.addDigits2(num));
	}
}
class Solution {
    public int addDigits1(int num) {
    	int sum = 0;
    	while(true){
        	while(num != 0){
            	sum += (num%10);
            	num /= 10;
            }
        	if(sum < 10){
        		return sum;
        	}
        	num = sum;
        	sum = 0;
    	}   
    }
    public int addDigits2(int num) {
    	return 1+(num-1)%9;//防止9被模掉,如18,结果应该为9
    }
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值