136. 只出现一次的数字
1 、给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
//哈希计算数组重复数字
public static void p1(int a[]) {
int []nums=new int[10];
for (int i = 0; i <a.length ; i++) {
nums[a[i]]++; //
}
for (int i = 0; i <nums.length ; i++) {
if (nums[i]==1){
System.out.println(i);
}
}
}
67. 二进制求和
2、给定两个二进制字符串,返回他们的和(用二进制表示)。
输入为非空字符串且只包含数字 1 和 0。
示例 1:
输入: a = “11”, b = “1”
输出: “100”
示例 2:
输入: a = “1010”, b = “1011”
输出: “10101”
所以我们可以将两个字符串进行倒序处理
public static void p2(String a,String b) {
StringBuffer result=new StringBuffer();
int len=java.lang.Math.max(a.length(),b.length());
int carry=0; //进位制
for (int i = 0; i <len ; i++) {
//先存储第一位数字
carry+=i<a.length()?(a.charAt(a.length()-1-i)):0;
carry+=i<b.length()?(b.charAt(b.length()-1-i)):0;
//插入除去进位之后的数字
result.append((char)(carry%2+'0'));
//保留进位数
carry/=2;
}
//等到完全算完,还有进位
if(carry>0){
result.append('1');
}
//我们求得的数字是从做到右排列的
// System.out.println(result.toString());
result.reverse();
System.out.println(result.toString());
}
70. 爬楼梯
3、假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
示例 1:
输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
-
1 阶 + 1 阶
-
2 阶
示例 2:
输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
-
1 阶 + 1 阶 + 1 阶
-
1 阶 + 2 阶
-
2 阶 + 1 阶
/* 爬楼梯问题,动态规划,需要设置一个dp[]全局变量,来记录递归过程中重复的数字
普通递归,当n=500的时候就会爆栈了
*/
private static int dp[]=new int[1000];
public static int p3(int n) {
if (n==0||n==1||n==2){return n;}//递归边界
if(dp[n]!=-1)return dp[n];
else {
dp[n]=p3(n-1)+p3(n-2); //计算p3(n)
//递归全部结束
return dp[n];
}
}
1114. 按序打印
4、我们提供了一个类:
public class Foo {
** public void one() { print(“one”); }**
** public void two() { print(“two”); }**
** public void three() { print(“three”); }**
}
三个不同的线程将会共用一个 Foo 实例。
线程 A 将会调用 one() 方法
线程 B 将会调用 two() 方法
线程 C 将会调用 three() 方法
请设计修改程序,以确保 two() 方法在 one() 方法之后被执行,three() 方法在 two() 方法之后被执行。
示例 1:
输入: [1,2,3]
输出: “onetwothree”
解释:
有三个线程会被异步启动。
输入 [1,2,3] 表示线程 A 将会调用 one() 方法,线程 B 将会调用 two() 方法,线程 C 将会调用 three() 方法。
正确的输出是 “onetwothree”。
示例 2:
输入: [1,3,2]
输出: “onetwothree”
解释:
输入 [1,3,2] 表示线程 A 将会调用 one() 方法,线程 B 将会调用 three() 方法,线程 C 将会调用 two() 方法。
正确的输出是 “onetwothree”。
9. 回文数
5、判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例 1:
输入: 121
输出: true
示例 2:
输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。
/*1.最简单的办法,把整数反转,与原来数字比较
单转过来的话,一个数字很可能超过int32位数
2.我们可以选择将一个回文数字,前半段与后半段进行比较
例如"12321",中的"12"和"21",只要相等就符合题意
3.这个时候我们又发现,12和21,就是个十百千位反转,
4.偶数和奇数的区别,"1221"和"12321"
5.负数,与整十数不是回文字数10,20,300
*/
public static boolean isPalindrome(int x) {
//如果数字为负数,一定不是,个位数字也一定不是
if (x<0||(x%10==0&&x!=0)){
return false;
}
int reverNum=0;
//x为偶数时,当x被除以10剩余部分等于rever的时候,循环结束
//x为奇数时,当x<reverNum的时候,循环结束,例如x=12,reverNum=123
//因此,我们最好返回的是
while(x>reverNum){
reverNum=reverNum*10+x%10;
x/=10;
}
//返回值为布尔类型.用或值
return x==reverNum||x==reverNum/10;
}