现在已经到了看一道题有一道题目不会的时候了,想拿这道题找自信 失败了,大脑已经生锈
- 1+2+3+..+n
package offer;
/*
1+2+...+n
*/
public class Test26 {
//递归求和
//边界测试 0和1
public static int sum(int n) {
if (n == 1||n==0)
return n;
int total = n + sum(n - 1);
return total;
}
//要求不能用if fori等 想到A?B:C
public static int sum2(int n) {
//利用 && 的短路特性实现递归,n<=0时,不运行后面的语句
boolean x = (n > 0) && (n += sum(n - 1)) > 0;
return n;
}
public static void main(String[] args) {
System.out.println(sum2(5));
}
}
- 1到n中不合位置的数
package offer;
/*
二分查找确实的元素
方法一 求和总数 -实际总数
方法二 直接位置值 不等于序号
*/
public class Test27 {
//先实现二分查找
//更改
public static int halfSearch(int[] arr) {
int low = 0;
int high = arr.length - 1;
int mid;
while (low <= high) {
mid = low + (high - low) / 2;
//如果中间的数值就是他的索引 那么就在右边
if (arr[mid] == mid)
low = mid + 1;
else
high = mid - 1;
}
//索引就是查找的那个没有的数值
return low;
}
public static void main(String[] args) {
int[] arr = {0, 1, 2, 4, 5, 6, 7, 8, 9};
System.out.println(halfSearch(arr));
}
}
- 字符流中第一个不重复的字符
package offer;
import java.util.HashMap;
import java.util.Map;
/*
如何找到字符流中第一个不重复的字符
*/
public class Test28 {
public static char firstAppear(String s) {
HashMap<Character, Integer> map = new HashMap<>();
StringBuffer str = new StringBuffer();
char[] ch = s.toCharArray();
for (char c : ch) {
str.append(c);
//放字符跟出现次数
map.put(c, map.getOrDefault(c, 0) + 1);
}
//一次次的放
int index = 0;
//统计第一个出现的次数
while (index < str.length()) {
if (map.get(str.charAt(index)) == 1)
return str.charAt(index);
index++;
}
return '#';
}
public static char firstAppear2(String s) {
//统计每个字符出现的次数
HashMap<Character, Integer> map = new HashMap<>();
for (int i = 0; i < s.length(); i++) {
int count = map.getOrDefault(s.charAt(i), 0);
map.put(s.charAt(i),++count);
}
//一次次的放
int index = 0;
//统计第一个出现的次数 按照字符串顺序找
while (index < s.length()) {
if (map.get(s.charAt(index)) == 1)
return s.charAt(index);
index++;
}
return '#';
}
public static void main(String[] args) {
String str = "google";
System.out.println(firstAppear2(str));
}
}