zoukankan      html  css  js  c++  java
  • 面试基础60题笑死牛刀

    1.有一个整数数组,请求出两两之差绝对值最小的值,

       1)若采用暴力则n^2

       2)qsort 则nlgn

       3)鸽笼原理 分成桶  n

    2.写一个函数,检查字符是否是整数,如果是,返回其整数值。
    (或者:怎样只用4行代码编写出一个从字符串到长整形的函数?)

           atoi

    3.给出一个函数来输出一个字符串的所有排列。

        采用排列数的方法 

       

    #include <stdio.h>
    
    void swap(char*str,int i,int k)
    {
        char temp=str[i];
        str[i]=str[k];
        str[k]=temp;
    }
    void PaiLie(char*str,int k,int r)
    {
        if(k==r){
            printf("%s\n",str);
            return ;
        }
        for(int i=k;i<=r;i++)
        {
            swap(str,i,k);
            PaiLie(str,k+1,r);
            swap(str,i,k);
        }
    }
    int main()
    {
        char s[]="ABC";
        PaiLie(s,0,2);
    
        return 0;
    }

    4.a请编写实现malloc()内存分配函数功能一样的代码。
      (b给出一个函数来复制两个字符串A和B。字符串A的后几个字节和字符串B的前几个字节重叠

    5.怎样编写一个程序,把一个有序整数数组放到二叉树中?

      二叉树排序的方式

    6.怎样从顶部开始逐层打印二叉树结点数据?请编程。

       层序遍历

    7.怎样把一个链表掉个顺序(也就是反序,注意链表的边界条件并考虑空链表)?

        利用栈的方式好不好?

    8.请编写能直接实现int atoi(const char * pstr)函数功能的代码。

       这个难度不大吧 主要翻译然后权值依次乘上10+当前这位数

          

    #include <stdio.h>
    #include <string.h>
    
    int __atoi(const char * pstr)
    {
        int plen=strlen(pstr);
        int sum=0;
        for(int i=0;i<plen;i++)
        {
           if(pstr[i]<='9'&&pstr[i]>='0')
           {
               sum*=10;
               sum+=pstr[i]-'0';
           }
           else
               return -1;
    
        }
        return sum;
    
    }
    int main()
    {
        char ss[]="234567";
        int ans=__atoi(ss);
        printf("%d\n",ans);
        return 0;
    }

    9.编程实现两个正整数的除法
    编程实现两个正整数的除法,当然不能用除法操作符。
    // return x/y.
    int div(const int x, const int y)
    {
    ….
    }

    //1.第一种思路 减法的思路

    //2. 移位操作

    10.在排序数组中,找出给定数字的出现次数
    比如 [1, 2, 2, 2, 3] 中2的出现次数是3次。

          1).基数排序  O(n)感觉已经落后了

          2).二分查找  找到最低位置和最高位置 lg(n)时间

    #include<stdio.h>
    #include<stdlib.h> 
    int arr[] = {0,1,1,2,2,2,2,4,4,4}; //测试数组 
    int size = sizeof(arr) / sizeof(*arr); //数组元素个数 
    int getUpper(int arr[], int key){//获取某个元素最后出现位置 
        int low = 0, high = size - 1;
        while(low < high){
            int mid = (low + high + 1) / 2;
            if(arr[mid] <= key)
                low = mid;
            else
                high = mid - 1;          
        } 
        return low; 
    }
    int getLower(int arr[], int key){//获取某个元素第一次出现位置 
        int low = 0, high = size - 1;
        while(low < high){
            int mid = (low + high) / 2;
            if(arr[mid] >= key)
                high = mid;
            else
                low = mid + 1;           
        }    
        return low; 
    } 
    int main()
    {
        for(int i = 0; i < size; i ++)
            printf("%d 出现 %d 次\n",arr[i],getUpper(arr,arr[i]) - getLower(arr,arr[i]) + 1);
        getchar();  
    } 

    11.平面上N个点,每两个点都确定一条直线,
    求出斜率最大的那条直线所通过的两个点(斜率不存在的情况不考虑)。时间效率越高越好。

  • 相关阅读:
    引导用户关注公众号
    python计算两组数据的P值
    【style-resources-loader】自动化导入CSS
    【concurrently】前端工程化并行解决方案
    【已解决】K8s + Ingress + Nodejs代理服务报错:413 Request Entity Too Large
    Python定时任务框架APScheduler实战Demo
    前端团队codeReview规范以及流程
    Git使用关键理解
    Vue+ESLint+Git钩子函数pre-commit配置教程
    【MongoDB】查询字段对应的数组中包含某个值
  • 原文地址:https://www.cnblogs.com/OneDream/p/3001742.html
Copyright © 2011-2022 走看看