算法题的常规解题思路

先来看一道编程题:将字符串"i am chinese man a better man"逆序成为"man better a man chinese am i".

public class ReverseString {
    public static void main(String args[]){
        String message = "i am a chinese man a better man";
        String[] array = message.split(" ");
        for(int i = array.length-1;i >= 0; i--){
            System.out.print(array[i]+" ");
        }
    }
}

问题解决的步骤和错误:
1. 解析问题,手工“解决”
(1)对于孩子和成年人而言,这一步对前者来说更困难
(2)然而,如果要求误解了问题的学生来重读这个问题,孩子们的表现会超过成年人
2. 想出一个伪代码算法
(1)在这一步,学生的表现比成年人要好。
(2)让人震惊的是,很多成年人不知道如何用他们偏好的编程语言从一个字符串中抽取一个字符。
3. 将算法转换为代码
(1)我们有一些C++程序员,他们不知道方括号以及一些C程序员,他们采用指针运算,但是却失败了。
(2)更让人吃惊的是,当他们允许查阅java API 文档 或者使用参考书,很多成年人无法找到合适的文档来帮助解决问题。
(3)的确,一些中学生已经忘了如何使用栈或者实例化一个队列,但是,所有人都能够在适当的时间内通过查阅找到解决办法。
(4)会写代码的成年人(曾经会)经常会超过时间限制。

有很多糟糕的代码编写者,即便你也是其中一个,也不要害怕
可以尝试下面的方法:
1. 不停练习,直到你能快速且正确地写出小的代码片段。没有任何理由用自己喜欢的语言写不出一个双循环。找一些带有例子的小的代码智力题,你能在一分钟以内理解这些问题。对这类问题做成百上千遍的练习(不仅仅是几十遍,切记!)。
2. 为课本上的每个算法写一个用例列表。一个共同的错误就是仅仅记住计算复杂度表。但是看一些算法的使用例子,例如 A*搜索在哪些地方使用,这比学习代码本身要有用的多。
3. 至少做一个能逼迫你使用与工作相关的接口/用例的大型项目。语言通常不是很重要,而且独自写一个大型工程能够强迫你去学新的设计模式以及远离遗留代码维护。代码面试是智力测试。所以它们很少关注具体的体系。
4. 让自己接触更优秀的程序员。随着 CS 岗位的快速增长,应对“柠檬市场”的当前解决办法就是技术面试。但是同样也有其他的方式来反映被面试者的信息。例如,对热点话题、博客、技术的知识可以反映出对重要问题的意识。类似地,对恐怖故事采用幽默的代码书写方式,可以反映出经验和处理新问题的能力。幸运的是,在线代码编写社区随处可见,所以唯一地障碍就是是否肯花时间和保持谦虚。

在来看一道编程题:抽中A的概率是1/6.抽中B的概率是5/6.

public class Lottery {
    public static void main(String[] args) {
        if(draw()) {
            System.out.println("you have get A");
        }else {
            System.out.println("you hava get B");
        }
    }
    static Boolean draw(){
        int temp = (int)(Math.random()*6);
        System.out.println(temp);
        if(temp == 0){
            return true;
        }else {
            return false;
        }
    }
}

再来一道:在一个二维数组中,每一行都是按照从左到右递增的顺序排序,每一列都按照从上到下递增的书序排序。请完成这样的一个函数,输入这样的一个二维数组和整数,判断该整数是否在数组中。

public class TestArray {
    public static void main(String args[]){
        int[][] array = { {1,2,3,4,5},
                          {2,3,4,5,6},
                          {3,4,5,6,7},
                          {4,5,6,7,8},
                          {5,6,7,8,9}};
        int num = 9;
        if(justify(array,num)){
            System.out.println("the array have number:"+num);
        }else{
            System.out.println("the array have not find number:"+num);
        }
    }
    
    static Boolean justify(int[][] array, int num){
        int len = array[0].length > array.length ? array.length:array[0].length;
        Boolean flag = true;
        for(int i = 0; i < len-1; i++){
            if((array[0][0] > num)||(array[array.length-1][array[0].length-1] < num)){
                flag = false;
            }
            if((array[0][0] < num)&&(array[i][i] >= num)){
                boolean out= true;
                for(int k = 0; (k <= i)&&(out); k++){
                    for(int m = 0; (m <= i)&&(out); m++){
                        if(array[k][m] == num){
                            flag =  true;
                            out = false;
                        }else {
                            flag =  false;
                        }
                    }
                }
            }
        }
        return flag;
    }
}
原文地址:https://www.cnblogs.com/RunForLove/p/4715057.html