1
给一个数组,数组中两数之和等于给定的target值,取出这两个数的位置; 如 nums= [2,7,11,15], target = 9; nums[0] + nums[1] = 9; return[0,1];
public class item1 {
public static void main(String[] arg) {
int[] p = {1,7,2,3,5};
int[] arr = twoSum2(p, 5);
System.out.println(arr[0]);
System.out.println(arr[1]);
}
// 方法一
public static int[] twoSum1(int[] nums, int target) {
if(nums == null || nums.length <2) {
return new int[]{-1,-1};
}
int[] res = new int[] {-1, -1};
for(int i =0; i<nums.length - 1; i++) {
for(int j = i+1; j< nums.length; j++) {
int item = nums[i] + nums[j];
if(item == target) {
res[0] = nums[i];
res[1] = nums[j];
break;
}
}
}
return res;
}
// 方法二
public static int[] twoSum2(int[] nums, int target) {
if(nums == null || nums.length <2) {
return new int[]{-1,-1};
}
int[] res = new int[] {-1,-1};
HashMap<Integer, Integer> map = new HashMap<>();
for(int i=0;i<nums.length;i++) {
if(map.containsKey(target -nums[i])) {
res[0] = map.get(target - nums[i]);
res[1] = i;
break;
}
map.put(nums[i], i);
}
return res;
}
}
2
给两个链表(3 -> 5-> 6) 和 (4->6 ->2)两表对应的值相加得到结果为(7->1->8),相加满足 满10进1;
public static ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode p1 = l1;
ListNode p2 = l2;
ListNode cur = new ListNode(0);
int sum = 0;
ListNode p3 = cur;
while(p1!=null||p2!=null) {
if(p1!=null) {
sum += p1.val;
p1=p1.next;
}
if(p2!=null) {
sum+=p2.val;
p2=p2.next;
}
p3.next = new ListNode(sum%10);
sum/=10;
p3 = p3.next;
}
if(sum >0) {
p3.next = new ListNode(sum);
}
return cur.next;
}
public static void main(String argp[]) {
ListNode li= new ListNode(1);
li.next = new ListNode(2);
ListNode l1 = new ListNode(5);
l1.next = new ListNode(4);
l1.next.next = new ListNode(6);
l1.next.next.next = new ListNode(3);
ListNode l2 = new ListNode(8);
l2.next = new ListNode(3);
l2.next.next = new ListNode(1);
l2.next.next.next = new ListNode(6);
ListNode result = addTwoNumbers(l1, l2);
ListNode op = result;
while(op !=null) {
System.out.println(op.val);
op = op.next;
}
}
/*
3
8
7
9
*/
3
一个stirng 取出string中 最长的 不重复的一段 如abcabcbb -> abc bbb -> b pwwkew ->wke
public static String NoRepeat(String li) {
String[] arr = li.split("");
Set set = new HashSet(arr.length);
String rs = "";
for(int i=0; i< arr.length; i++) {
String list = Select(arr, arr[i], i);
set.add(list);
}
for (Object object : set) {
rs = rs.length() < ((String) object).length() ? (String) object : rs;
}
return rs;
}
public static String Select(String[] arr, String a, int j) {
String rs = a;
for(int i=j+1; i<arr.length; i++) {
if(!arr[i].equals(a) && !rs.contains(arr[i])) {
rs += arr[i];
} else {
return rs;
}
}
return rs;
}
public static void main(String argp[]) {
String a="pwwkewsdfghqw";
String data = NoRepeat(a);
System.out.println(data);
}
4 在一个数组中找到三个数之和为0,
如 [-4, -3, 0, 2, 3, -1, 1,]找到三个和为0的三个数
一般有三种方法:
- 循环三次,时间复杂度为o(n^3)
- 循环两次,把数组用set装起来,在再set里面找到 -(a+b) 的值就行了,时间复杂度为o(n^2),空间复杂度为o(n)需要用到set
- 先把数组sort从小到大排序,剩余的数用看成一组,比如数组sort后为[-4,-3,-1,0,1,2,3],先循环第一个数为-4,然后[-3,-1,0,1,2,3]看成一组,取出最两边的两个数,b=-3,c=3,和4相加 如果a+b+c > 0,则c向左移动,如果a+b+c < 0则b向右移动,一次类推找到和为0的三个数,时间复杂度为o(n)
// 循环两次
public static void test1(List<Integer> li) {
Set<List> res = new HashSet<>();
for(int i = 0; i<li.size(); i++) {
int a = li.get(i);
for(int j = i+1; j<li.size(); j++) {
List rs = new ArrayList();
int b = li.get(j);
int num = -(a+b);
if(li.contains(num) && num !=a && num !=b) {
int c = num;
rs.add(a);
rs.add(b);
rs.add(c);
Collections.sort(rs); // 排序去重
res.add(rs);
continue;
}
}
}
// 打印
for (List rs : res) {
String a = "";
for(int i =0; i<rs.size();i++) {
a += " r"+i +":" + rs.get(i);
}
System.err.println(a);
}
/*
r0:-4 r1:1 r2:3
r0:-3 r1:1 r2:2
r0:-3 r1:0 r2:3
r0:-1 r1:0 r2:1
*/
}
// 循环一次
public static void test2() {
int[] arr = new int[]{-4, -3, 0, 2, 3, -1, 1};
List<Integer> li = new ArrayList<Integer>();
for (int i = 0; i < arr.length; i++) {
li.add(arr[i]);
}
Collections.sort(li);
Set<List> res = new HashSet<>();
for (int i = 0; i < li.size(); i++) {
int a = li.get(i);
int l=i+1, r=li.size() - 1;
while(l<r) {
List rs = new ArrayList();
int s = li.get(i) + li.get(l) + li.get(r);
if(s > 0) {
r =r- 1;
} else if(s<0) {
l=l+1;
} else {
rs.add(li.get(i));
rs.add(li.get(l));
rs.add(li.get(r));
Collections.sort(rs); // 排序去重
res.add(rs);
while(l<r && li.get(l) == li.get(l+1)) {
l+=1;
}
while(l<r && li.get(r) == li.get(r-1)) {
r-=1;
}
l+=1;
r-=1;
}
}
}
// 打印
for (List rs : res) {
String a = "";
for(int i =0; i<rs.size();i++) {
a += " r"+i +":" + rs.get(i);
}
System.out.println(a);
}
};