常见面试中的算法解法

1、替换空格

解法:如果通过直接遍历str,找到其中的空格就进行替换,这样做时间复杂度则为O(n2),那么我们得想到优化这个替换过程,我们可以先遍历str得到有多少个空格需要替换,然后从后向前进行遍历这个str进行替换。

2、从尾到头打印链表

解法一:从头遍历链表,将遍历结果依次存进一个栈中,然后再遍历这个栈,就可以得到这个链表从尾到头每个节点的值

解法二:我们采取递归,代码如下。

3、用两个栈实现队列

栈的特点是后进栈先出,队列是先进栈先出。那么如果用两个栈实习的队列的添加和删除

a->b  删除a元素,那么就将stack1的元素输出依次放入stack2,输出stack栈顶,就相当于把队列的头删除了

b->c 如果依然继续删除,那么再将stack2的栈顶弹出就可

d 插入元素,直接放进stack1就可

d->e 如果要删除元素,先判断,stack2有没有元素,如果有直接弹出栈顶就可,如果没有那么就想a->b那样操作删除元素

4、旋转数组的最小数字

解析:

用p1和p2指向数组最开始头和尾,如果p1<p2,这个数组就是有序的,如果p1>=p2,那么就找到p1、p2中间元素记为mid。如果,mid<p1,则最小元素在mid和p1之间,则让p2指向mid。反之如果mid>p1,那么最小元素在mid和p2之间,让p1指向mid。如果p2-p1=1,那么这两个最小的元素就是数组中最小的。

注意:以上解法只适合与不含重复元素的数组中,如果像{0,1,1,1,1}的两个旋转数组{1,0,1,1,1}和{1,1,1,0,1}这两个数组中,是没法进行二分查找的  因为mid和p1 p2相等,这样没法判断最小元素在mid左侧还是右侧。这种情况只有采取顺序查找。

5、二进制中1的个数

解析:把一个数减去1.在和原整数做与运算,会把该整数最右边一个1变成0,那么一个整数的二进制表示中有多少个1,就可以进行多少次这样的操作。代码如下:

 public static int NumberOf1(int n){
        int count=0;
        while(n != 0){
            ++count;
            n = (n-1) & n;
        }
        return count;
    }

此题扩展:

6、在O(1)时间段删除链表结点

解题思路:删链表节点,第一时间想到就是遍历整个链表,找到删除节点的前驱,改变节点指向,删除节点,但是,这样删除单链表的某一节点,时间复杂度就是O(n),不符合要求;如果我们考虑用所要删除结点的数据来替换要删除的结点数据,并指向删除结点的下下个结点,最后把要删除的哪个结点的下一个结点删掉就完成了。

7、调整数组顺序使奇数位于偶数前面

解题思路:

我们让p1和p2指向数组开头和结尾  当p1为偶数,p2为奇数时则让两个值进行交换,如果不符合,p1往后移。p2往前移,直到p2的位置在p1前面,代码如下

 public  static int[] sortArr(int [] arr,int start,int end) {
        while (start < end) {
            int temp;
            if (arr[start] % 2 == 0 && arr[end] % 2 == 1) {
                temp = arr[start];
                arr[start] = arr[end];
                arr[end] = temp;
                ++start;
                --end;
            } else if (arr[start] % 2 == 1 || arr[end] % 2 == 1) {
                ++start;
            } else {
                --end;
            }
        }
        return arr;
    }

8、链表中倒数第K个结点

解题思路:如果我们从头开始遍历。然后找到倒数第k个,这样时间复杂度在O(n2),不是最好的解题思路,那么我们咋做到O(n)的查找呢?很简单,我们让两个指针同时遍历这个链表,这两个指针相距k个结点,当第一个指针遍历到尾结点了,那么就说明后面一个指针遍历的就是倒数第k个结点。代码如下:

原文地址:https://www.cnblogs.com/liujunj/p/8997876.html

时间: 2024-08-28 17:39:33

常见面试中的算法解法的相关文章

程序员如何快速准备面试中的算法

前言 我决定写篇短文,即为此文.之所以要写这篇文章,缘于微博上常有朋友询问,要毕业找工作了,如何备战算法.尽管在微博上简单梳理过,如下图所示: 但因字数限制,特撰此文着重阐述下:程序员如何快速准备面试中的算法,顺便推荐一些相关的书籍或资料. 备战面试中算法的五个步骤 总体来说,备战面试中的算法,分为五个步骤,如下: 1.首选你得确保自己已经掌握好一门编程语言 如果是C的话,推荐Dennis M. Ritchie & Brian W. Kernighan著的<C程序设计语言>,和<

机器学习&amp;数据挖掘笔记_16(常见面试之机器学习算法思想简单梳理)

http://www.cnblogs.com/tornadomeet/p/3395593.html 机器学习&数据挖掘笔记_16(常见面试之机器学习算法思想简单梳理) 前言: 找工作时(IT行业),除了常见的软件开发以外,机器学习岗位也可以当作是一个选择,不少计算机方向的研究生都会接触这个,如果你的研究方向是机器学习/数据挖掘之类,且又对其非常感兴趣的话,可以考虑考虑该岗位,毕竟在机器智能没达到人类水平之前,机器学习可以作为一种重要手段,而随着科技的不断发展,相信这方面的人才需求也会越来越大.

程序员如何快速准备面试中的算法 - 结构之法

准备面试.学习算法,特别推荐最新出版的我的新书<编程之法:面试和算法心得>,已经上架京东等各大网店 前言 我决定写篇短文,即为此文.之所以要写这篇文章,缘于微博上常有朋友询问,要毕业找工作了,如何备战算法.尽管在微博上简单梳理过,如下图所示: 但因字数限制,许多问题无法一次性说清楚,故特撰此文着重阐述下:程序员如何快速准备面试中的算法,继而推荐一些相关的书籍或资料.顺便也供节后跳槽.3月春季招聘小高潮.及6月毕业找工作的朋友参考. 备战面试中算法的五个步骤 对于立志进一线互联网公司,同时不满足

【转】常见面试之机器学习算法思想简单梳理

转:http://www.chinakdd.com/article-oyU85v018dQL0Iu.html 前言: 找工作时(IT行业),除了常见的软件开发以外,机器学习岗位也可以当作是一个选择,不少计算机方向的研究生都会接触这个,如果你的研究方向是机器学习/数据挖掘之类,且又对其非常感兴趣的话,可以考虑考虑该岗位,毕竟在机器智能没达到人类水平之前,机器学习可以作为一种重要手段,而随着科技的不断发展,相信这方面的人才需求也会越来越大. 纵观IT行业的招聘岗位,机器学习之类的岗位还是挺少的,国内

常见面试之机器学习算法思想简单梳理

http://www.cnblogs.com/tornadomeet/p/3395593.html (转) 前言: 找工作时(IT行业),除了常见的软件开发以外,机器学习岗位也可以当作是一个选择,不少计算机方向的研究生都会接触这个,如果你的研究方向是机器学习/数据挖掘之类,且又对其非常感兴趣的话,可以考虑考虑该岗位,毕竟在机器智能没达到人类水平之前,机器学习可以作为一种重要手段,而随着科技的不断发展,相信这方面的人才需求也会越来越大. 纵观IT行业的招聘岗位,机器学习之类的岗位还是挺少的,国内大

常见面试之机器学习算法思想简单梳理【转】

前言: 找工作时(IT行业),除了常见的软件开发以外,机器学习岗位也可以当作是一个选择,不少计算机方向的研究生都会接触这个,如果你的研究方向是机器学习/数据挖掘之类,且又对其非常感兴趣的话,可以考虑考虑该岗位,毕竟在机器智能没达到人类水平之前,机器学习可以作为一种重要手段,而随着科技的不断发展,相信这方面的人才需求也会越来越大. 纵观IT行业的招聘岗位,机器学习之类的岗位还是挺少的,国内大点的公司里百度,阿里,腾讯,网易,搜狐,华为(华为的岗位基本都是随机分配,机器学习等岗位基本面向的是博士)等

包建强的培训课程(5):面试中的算法题

Normal 0 10 pt 0 2 false false false EN-US ZH-CN X-NONE $([{£¥·‘“〈<「『[[[〝﹙﹛﹝$(.[{£¥ !%),.:;>?]}¢¨°·ˇˉ―‖’”…‰′″›℃∶.."〉>」』]]]〞︶︺︾﹀﹄﹚﹜﹞!"%'),.::?]`|}-¢ /* Style Definitions */ table.MsoNormalTable {mso-style-name:普通表格; mso-tstyle-rowband-size:0;

用ES6巧妙的解决传统面试中的算法小问题!

最近自己也在准备面试,在复习算法的时候,机智的用了一波ES6.一起来瞧瞧吧! 1.数组的去重 var arr=str.split(''); for(var i=0;i<arr.length-1;i++){ for(var j=i+1;j<arr.length;j++){ if(arr[i]==arr[j]){ arr.splice(j,1); // arr.length-=1;删完长度自动减1 j--; console.log(arr) } } } 用两层循环来做的话,好像麻烦了点哦.好像ES

初识面试中的算法题

在面试过程中,常常被要求手撕代码,作者作为测试经理,也经常被手撕代码.手撕代码的内入无非是对字符串.数组.元组.字典进行操作.第一题:取值:1.从字符串及元组中取值str1 = "abcd"stra, strb, strc, strd=str1结果:"a","b","c","d"2.从数组中取值list1 = [a,b,c,d]lista = list1[0],以此类推,中括号中的数字是数组的下标,从0开始