当前位置:   article > 正文

数据结构算法题(小牛试刀)

数据结构算法题

数据结构是为算法服务的,算法是作用在特定的数据结构之上的

 

指向效率是评价算法好坏的一个非常重要的指标,衡量的方法常用的是时间复杂度的空间复杂度分析。复杂的分析有事后分析法和算法执行效率估算法

  • 最常见的使用是大O复杂度表示法,表示的是代码的执行时间随着数据规模的增大的变化趋势

数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图

算法:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法

1.进制转换

  • 数制转换

    10进制转化其他进制对应的方法,参数n(原10进制数据)返回值
    10进制转2进制Integer.toBinaryString(n);二进制字符串
    10进制转8进制Integer.toOctalString(n);八进制字符串
    10进制转16进制Integer.toHexString(n);十六进制字符串
    10进制转r进制(r表示任意)Integet.toString(n,r);r进制字符串
  • 其他进制转十进制

    Integer.valurof(String s,int radix):Integer      radix进制的字符串转十进制

直接将0xAA不能转化为十进制,需要去除前面的0x

  1. Scanner sc = new Scanner(System.in);
  2. while (sc.hasNextLine()) {
  3. String str = sc.nextLine();
  4. //简化写法System.out.println(Integer.valueOf(str.substring(2), 16).toString());
  5. String ss = str.substring(2);
  6. int kk = Integer.valueOf(ss, 16);
  7. System.out.println(kk);
  8. }
  9. sc.close();

2.两数之和

直观思路:两层for循环,暴力匹配

  1. public static void main(String[] args) {
  2. String str = "[3,2,4],6";
  3. String[] arr = str.split("[\\[,\\]]");
  4. int[] brr = Arrays.stream(arr).filter(t -> t.trim().length() > 0).mapToInt(Integer::valueOf).toArray();
  5. int[] crr = Arrays.copyOf(brr, brr.length - 1);
  6. int target = brr[brr.length - 1];
  7. System.out.println(target);
  8. int[] res = twoSum(crr, target);
  9. System.out.println(Arrays.toString(res));
  10. }
  11. public static int[] twoSum(int[] arr, int target) {
  12. int[] res = new int[2];
  13. for (int i = 0; i < arr.length; i++) {
  14. for (int k = 0; k < arr.length; k++) {
  15. if (i < k && target == arr[i] + arr[k]) {
  16. res[0] = i + 1;
  17. res[1] = k + 1;
  18. }
  19. }
  20. }
  21. return res;
  22. }

问题:时间复杂度O(n^2),而且还有无效的循环

优化:思路:获取一个数据a后,查找的数据应该是确定的,只要简化查找次数则可以降低时间复杂度

查找数据时间复杂度最低还是hashmap,选择key存储具体数据,使用value存储对应的序号

  1. public int[] twoSum(int[] arr,int terget){
  2.    //解算法题目时,要求直接使用具体类,不要考虑面向对象的问题
  3.    HashMap<Integer,Integer> map = new HashMap<>();
  4.    for(int i = 0;i < arr.length;i++)
  5.        map.put(arr[i],i);
  6.    int[] res = new int[2];
  7.    for(int i = 0;i < arr.length;i++){
  8.        if(map.containsKey(target-arr[i])){
  9.            if(map.get(arr[i]) < map.get(target - arr[i])){
  10.                res[0] = map.get(arr[i] + 1);
  11.                res[1] = map.get(target-arr[i] +1);
  12.                break;
  13.           }
  14.       }
  15.   }
  16. }

3.明明的随机数

  1. Scanner sc = new Scanner(System.in);
  2. int num = sc.nextInt();
  3. TreeSet<Integer> set = new TreeSet<>();
  4. for(int i = 0;i < num;i++)
  5.    set.add(sc.nextInt());
  6. sc.close();
  7. System.out.println(set.size());
  8. for(Integer tmp : set)
  9.    System.out.print(tmp+" ");

4.字符个数统计

  1. Scanner sc = new Scanner(System.in);
  2. HashSet<Character> set = new HashSet<>();
  3. if (sc.hasNextLine()) {
  4. String str = sc.nextLine();
  5. for (char x : str.toCharArray()) {
  6. if (x < 128)
  7. set.add(x);
  8. }
  9. }
  10. sc.close();
  11. System.out.println(set.size());

扩展:按照出现次数倒序输出

  • 除非答题中已经提示自定义类,否则一般不要考虑使用自定义类型的方法

  • 需要存储字符和对应的 出现次数,考虑使用Map

  1. Scanner sc = new Scanner(System.in);
  2. String str = sc.next();
  3. HashMap<Character, Integer> map = new HashMap<>();
  4. for (char tmp : str.toCharArray()) {
  5. int count = 1;
  6. if (map.containsKey(tmp)) {
  7. count = map.get(tmp) + 1;
  8. }
  9. map.put(tmp, count);
  10. }
  11. sc.close();
  12. TreeSet<Entry<Character, Integer>> set = new TreeSet<>(new Comparator<Entry<Character, Integer>>() {
  13. @Override
  14. public int compare(Entry<Character, Integer> o1, Entry<Character, Integer> o2) {
  15. int res = o2.getValue().compareTo(o2.getValue());
  16. if (res == 0)
  17. res = o1.getKey().compareTo(o2.getKey());
  18. return res;
  19. }
  20. });
  21. set.addAll(map.entrySet());
  22. System.out.println(set);

5.跳台阶

一只青蛙一次可以调跳上一级台阶,也可以跳上两级,求该青蛙跳上一个n级台阶总共有多少种跳法,先后次序不同算不同的结果

递归编程实现

  1. public static void main(String[] args){
  2.    int res = jump(20);
  3.    System.out.println(res);
  4. }
  5. public int jump(int targer){
  6.    if(targer == 1)
  7.        return 1;
  8. if(targer == 2)
  9.        return 2;
  10.    return jump(target -1)+jump(target - 2);
  11. }

时间复杂度为O(2^n),问题在于重复计算,引入Map可以记录以前的计算结果,从而减小计算次数

当计算f(18)时首先到Map中查找18对应的值,如果没有对应的值,则进行计算,计算完成后将计算结果 插入Map,供后续使用

  1. public class A1 {
  2. private HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
  3. public static void main(String[] args) {
  4. A1 aa = new A1();
  5. int res = aa.jump(10);
  6. System.out.println(res);
  7. }
  8. public int jump(int target) {
  9. if (map.containsKey(target))
  10. return map.get(target);
  11. else {
  12. int res = 0;
  13. if (target == 1)
  14. res = 1;
  15. else if (target == 2)
  16. res = 2;
  17. else
  18. res = jump(target - 1) + jump(target - 2);
  19. map.put(target, res);
  20. return res;
  21. }
  22. }
  23. }

map的输出为

[map={1=1, 2=2, 3=3, 4=5, 5=8, 6=13, 7=21, 8=34, 9=55, 10=89, 11=144, 12=233, 13=377, 14=610, 15=987, 16=1597, 17=2584, 18=4181, 19=6765, 20=10946}]

从小往大计算:动态规划

从key发现f(n) = f(n-1) + f(n-2)可以使用数组存储历史数据,从前向后推

  1. public int jump(int target){
  2.    int x1 = 0;
  3.    int x2 = 0;
  4.    int res = 0;
  5.    for(int i = 1;i < target;i++){
  6.        if(i == 1){
  7.            x1 = 1;
  8.            continue;
  9.       }else if(i == 2){
  10.            x2 = 2;
  11.            continue;
  12.       }
  13.        res = x1 + x2;
  14.        x1 = x2;
  15.        x2 =res;
  16.   }
  17.    return res;
  18. }

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号