精华内容
下载资源
问答
  • 当遇到不会做的编程时——

    千次阅读 2019-11-22 06:59:04
    【引子】  CSDN博客在每篇博文下面加了一个... 在我的定位里,没有辅导作业的位置(甚至人找我代做作业)。早起看到的一道作业求助,还是想帮一把了。当然,源“鱼”求“渔”。 【提问】  请问您能帮忙...

    【引子】
      CSDN博客在每篇博文下面加了一个“私信求帮助”的链接。我不知道这个链接是否能长久,对博主而言,增加了互动,但可能负担也来了。
      这两天的私信就是多了,各种不在自己“定位”范围内的事也有了。本职工作和自己的方向在,定位需要有。
      在我的定位里,没有辅导做作业的位置(甚至有人找我代做作业)。早起看到的一道作业求助,还是想帮一把了。当然,假“鱼”求“渔”。

    【提问】
      请问您能帮忙看看这个吗?在这里插入图片描述
    【回答】
      你需要先给出自己的思路,别人再接着你想法去“看看”,这样的帮助才是有效的。不提供自己的思路就找别人帮助,这是个很大的问题。
      若你没有自己的思路,相对而言,这是一个不算太大的问题。在学习方法上注意一些即可,遇到一道自己暂时搞不定的题,就是最好的机会。
      看看书上相关的一些内容,自己的想法会在看书的过程中来到。往往很多时候,你需要给自己机会将学过的知识与待解决的问题联系起来,这就是个机会。将知识要内化成为自己的一部分,就是这样来的。
      若看书也找不到思路,可能你的欠帐有点多了。学着分解一下这道题,做个简化版本,由简到繁,这是学习要有的节奏。以此题为例,大致可以这样简化:(1)输入男生身高,输出标准体重;(2)输入身高和性别,输出标准体重;(3)输入身高范围和间隔,输出这个身高范围内男生的标准体重。到这里,这道题自然能出来了。
      会这样的分解小题目,不仅是解决当下学习的需求,你也在找将来做大项目时要分解的感觉。这是学习的手段,也是初学者学习的内容。若分解后还是不会做,你已经找到了自己循序渐进的点——找书看一看,把解决小问题的知识点与这个问题联系起来,搞定小问题,同时,搞定了更基础的知识点。
      受精力限制,贺老师不提供作业辅导服务。但这个题目真好,也赞赏你能主动向外界求助的做法,就多说一些。在方法上借此进步一些,匹配上自己的行动,就这样。

    展开全文
  • 输入: 3 0x62 0x80 0x00 2 4 5 /// 输出: 6 5上面3表示连续输入3个 十六进制:0x62 0x80 0x00 二进制为 01100010 1000000 000000002表示连续输入两个数:4,5。即先取上面二进制的前四个,转为整数0110即为6,00101...
    输入:
    3
    0x62 0x80 0x00
    2
    4
    5
    ///
    输出:
    6
    5

    上面3表示连续输入3个 十六进制:0x62 0x80 0x00 二进制为 01100010 1000000 00000000

    2表示连续输入两个数:4,5。即先取上面二进制的前四个,转为整数0110即为6,00101即为5

    #include<stdio.h>
    int main(){
    	char temp[10000];
    	int l=1,r=0,ii,i,j=1,k=1,n,m,mm,p,tt[999],aa[6],cul=0;
    	int ss;
    	scanf("%d",&n);
    	while(n--){
    		scanf("%x",&ss);
    	    for (i = 0; i < 8; ++i) //输入的同时将十六进制转为二进制
            {
              tt[8*j - 1 - i] = ss % 2;  //因为是十六进制输入,刚好可以移位取bit
                 ss /= 2;
            } 
            j++;	                    //保证输入的每一个十六进制均成为8位的二进制  			
    	}
    	//for(i=0;i<24;i++){
    	//	printf("%d",tt[i]);
    	//}
        scanf("%d",&m);                   //输入截取数量
        mm=m;
        aa[0]=0;
        while(m--){
        	scanf("%d",&p);               //依次输入截取位数
        	aa[k]=p;
            k++;
    	}
    	for(i=0;i<mm;i++){
    		
    		for((ii=aa[i+1]+cul-1);ii>=cul;ii--){
    		   r=r+tt[ii]*l;         //二进制转十进制	   
    		   l=l*2;            	       
    		}
    		cul=cul+aa[i+1];
    		printf("%d\n",r);
    		l=1;                    //归零
    		r=0;
    	}	
    	return 0;
    }


    展开全文
  • 会不会面试官对你鄙视说,这么简单的题目不会做?反正我是没有见过。做不出来,不是你苯,是因为前面很多步骤卡住了你。 要解出一道编程题目,首先要经过几个步骤。  1. 基本类型,基本几个库函数名字要...

      又到了找工作,跳槽的季节。曾几何时,大家有没有懊恼过,为什么简单得不简单的编程题,会做得这么辛苦?而且还做不出来。会不会有面试官对你鄙视说,这么简单的题目都不会做?反正我是没有见过。做不出来,不是你苯,是因为前面有很多步骤卡住了你。

    要解出一道编程题目,首先要经过几个步骤。

      1. 基本类型,基本几个库函数名字要记住。防止溢出,记得库函数的用法,有哪些坑。

      2. 如果是C/C++,要注意指针的用法,注意各种内存的管理。

      3. 根据具体要求,要实现各种数据结构(链表,树,堆),和与数据结构相应的基本操作函数或者方法。如果能用C++里面的STL自然是更快了。

      4. 处理数据使用各种排序,遍历方法。要识别出应用那种算法,并且自己实现它。虽然算法实现过程看起来简单,但是他的算法复杂度分析推导过程是比较复杂的,如果你没有仔细看书体会推导过程,你自己推导是比较难的,那你只能死记硬背算法和他的时间空间复杂度。

      5. 经过上面的基本处理,数据已经被各种预处理过,再应用自己设计好的算法去解决问题。如果是动态规划问题,要找出重复最优子结构,还是说这个要遍历减枝,要使用贪心算法。

      6. 考虑各种边界条件,单元测试。

      所以,在解决问题的核心问题之前,你就需要处理这么多问题。这个也是一方面表现了C/C++学习曲线陡峭,如果用脚本语言来是做算法题,那肯定是快很多。如果你做不出来编程题,那你就需要看看自己哪个环节比较薄弱,需要花点时间去补一下,而不是死扣题目,拼命涮题,请把前面几个步骤的基础打扎实了。简单的编程题,其实不简单,它包含了两方面(思维方法,代码实操编写),这两者都不简单,除非你背熟了答案。

      在面试的时候如果发生这种情况,面试官认为默认认为你会使用C++ STL,那他心里就会嘀咕,这么简单的问题,他在搞啥呢?这时候,可能你还在满头大汗地实现一个堆结构,还在写排序。其实应聘者也很纠结,因为有些题目就是要你实现一个数据结构,如果你使用STL,那没有意义了,或者意义不大,就是简单证明你会用STL。所以要跟面试官搞清楚能不能使用STL。这也是大家拒绝冷冰冰的笔试的原因,因为希望在解决问题的时候,能与面试官交流,纸上描述并不能囊括题目所有的条件要素,同时面试官也能看清楚应聘者的思考过程,在应聘者遇到小问题卡住,不能进行的时候,能够给予一些小提示小启发,看他是否能排除这个小问题,最终解决整个问题。而不是笔试题目答题纸上冷冰冰的对与错,然后就打发人家回去。

      如果哪个面试官说很简单,那么他也没有理解编程的每一个知识点,只不过从网上下载的面试题,然后就简单地扔给应聘者做,然后觉得很简单,不停地催,这么简单怎么做这么慢啊?面试者跟他交流,由于他不了解题目,他也会觉得,这么简单怎么问得这么啰嗦啊。如果被你被这种面试官刷了,即不幸,也幸运,没有什么大不了的。

    转载于:https://www.cnblogs.com/studyNT/p/8467985.html

    展开全文
  • 在LeetCode的第一下面,这样一句评论“人相爱,人夜里开车看海,人leetcode第一不出来。”看到这条评论,你是得意的笑呢,还是苦涩的笑? LeetCode第一为“两数之和”,难度为“简单”,如果这样...

    在LeetCode的第一题下面,有这样一句评论“有人相爱,有人夜里开车看海,有人leetcode第一题都做不出来。”看到这条评论,你是得意的笑呢,还是苦涩的笑?

    LeetCode第一题为“两数之和”,难度为“简单”,如果这样一个简单的题,没做不出来,的确有些心酸。这就像学一门编程语言时,打印“Hello World”的程序都没写不出来的感觉是一样的,凄凉。

    下面就来一起看看这道题。

    “两数之和”

    题名称为“两数之和”,题目详情如下,对应官方链接:https://leetcode-cn.com/problems/two-sum/

    在这里插入图片描述

    题面分析

    题目用大白话来说就是:有一个整数数组,从中找出两个数,这两个数满足它们的和等于指定的数。
    在这里插入图片描述

    然后就是一些限制性条件,比如:“只会有一个答案”,那么一旦找到一组数据,直接返回就OK了。

    其中“数组中同一元素不能使用两遍”这个限制条件有一定的歧义,迷惑了很多人,我在第一次做题的时候就很困惑:循环两次算是“使用两遍”吗?

    结合官方给出的双层for循环方法,仔细分析之后,才明白这里的“使用两遍”并不是读取或遍历两次,而是指计算和时不能使用两次。比如,数组内容为[2,3,4],指定目标值为6,那么返回的结果应该是[0,2],也就是2+4=6,而不是3 + 3 = 6。这才是题意中的使用两遍的本意。

    下面看具体的解答方案。

    方案一:暴力枚举

    我们先从最简单,能直观看到的解题方案:双层循环,也就是暴力枚举。

    基本思路就是:遍历数组中的每一行数据x,然后拿目标数值target减去x(即target - x),然后再次遍历数组寻找值为target - x的数据项。
    在这里插入图片描述

    在计算过程中,很显然当循环执行到9-2=7之后,7已经存在于数组当中,不需要再继续计算匹配了。此循环过程,还可以进一步优化:第一层循环之后,x之前的元素已经匹配过了,因此不需要再次匹配,只需匹配x之后的元素即可。

    实现代码如下:

    // 暴力遍历
    public int[] twoSum(int[] nums, int target) {
        int len = nums.length;
        for (int i = 0; i < len - 1; i++) {
            for (int j = i + 1; j < len; j++) {
                if (nums[i] + nums[j] == target) {
                    return new int[]{i, j};
                }
            }
        }
        return new int[0];
    }
    

    注意上面第二层for循环中j取值为i+1,就是上面所说的x之前的元素不再匹配,直接匹配后面的元素。

    计算上述代码的时间复杂度,直接看最内层(第二层循环)的时间频度,随着第一层循环的执行,第二层的时间频度依次为n-1,n-2,n-3,n-4…… 2,1,是一个等差数列,因此整体的时间复杂度计算公式为 n(n-1 + 1)/2 = n^2/2。得到时间复杂度为: O(n^2)。

    由于在该算法中定义的内部变量只有len,它是固定值,不会随着nums数组的变化而变化,也就是常数,因此空间复杂度为1,记作 O(1)。

    方案二:哈希表

    说到哈希表,它是在算法中经常会用到的一种数据存储结构,可以根据key轻易的获得对应的value值。甚至可以说,每当遇到一个新算法时,都要优先考虑一下能否通过哈希表的形式来解决。

    使用哈希表进行存储会引起空间复杂度的变化。哈希表存储的数据可能会随着问题规模n的增加而增加,因此,空间复杂度很可能会由原来的O(1)变为O(n),这种变换也就是通常所说的拿空间换时间。

    暴力枚举算法中,我们看到导致算法复杂度较高的原因是查找target-x的时间复杂度较高,因此,可采用上面提到的哈希表来实现快速查找元素的目的。将原来查找的时间复杂度会从O(n)降低为近似O(1)。为什么说是近似O(1)呢?因为一旦出现哈希冲突,查找用时可能会退化到 O(n)。但只要仔细地挑选哈希函数,在哈希表中进行查找的用时应当被摊销为 O(1)。

    在本题中,就可以拿空间换时间,先创建一个哈希表,对于每一个 x,首先查询哈希表中是否存在target - x,如果不存在则将 x 插入到哈希表中,如果存在则返回key对应的坐标和当前元素的坐标。
    在这里插入图片描述

    整体来看,该算法就是:一个外层for循环,一个内层哈希表的快速查找。示例代码如下:

    class Solution {
        public int[] twoSum(int[] nums, int target) {
            Map<Integer, Integer> map = new HashMap<Integer, Integer>();
            for (int i = 0; i < nums.length; ++i) {
                if (map.containsKey(target - nums[i])) {
                    return new int[]{map.get(target - nums[i]), i};
                }
                map.put(nums[i], i);
            }
            return new int[0];
        }
    }
    

    我们知道,哈希表查询的时间复杂度为O(1),外层循环时间复杂度为O(n),因此该算法的时间复杂度为 O(n) 。关于空间复杂度,随着问题规模n的变化,哈希表所占的空间也会随着变化,因此,空间复杂度 O(n)。

    方法三 排序 + 双指针

    除了上述两种算法之外,还有一种解决方案的思路:先将nums元素排序,再使用两个指针,从前后两个值开始逐步逼近target。具体实现代码如下:

    public int[] twoSum2(int[] nums, int target) {
    
        // 转化成 List, 以方便排序
        List<Integer> numList = new ArrayList<>(nums.length);
        // 保留原始 坐标位置
        Map<String, Integer> location = new HashMap<>(nums.length);
        for (int i = 0; i < nums.length; i++) {
            numList.add(nums[i]);
            if (location.containsKey(nums[i] + "")) {
                location.put(nums[i] + "AGAIN", i);
            } else {
                location.put(nums[i] + "", i);
            }
        }
    
        Collections.sort(numList);
        int preIdx = 0;
        int sufIdx = numList.size() - 1;
        int[] result = new int[2];
        int tmpPre,tmpSuf;
        while (preIdx < sufIdx) {
            tmpPre = numList.get(preIdx);
            tmpSuf = numList.get(sufIdx);
            int tmpRes =  tmpPre + tmpSuf;
            // 两数之和 大于 target,后面的坐标前移
            if (tmpRes > target) {
                sufIdx -= 1;
            } else if (tmpRes < target) {
                // 两数之和 小于 target , 前面的坐标后移
                preIdx += 1;
            } else {
                if (location.containsKey(tmpPre + "AGAIN")) {
                    result[0] = location.get(tmpPre + "AGAIN");
                    location.remove(tmpPre + "AGAIN");
                } else {
                    result[0] = location.get(tmpPre + "");
                }
                if (location.containsKey(tmpSuf + "AGAIN")) {
                    result[1] = location.get(tmpSuf + "AGAIN");
                    location.remove(tmpSuf + "AGAIN");
                } else {
                    result[1] = location.get(tmpSuf + "");
                }
                if (tmpPre == tmpSuf) {
                    // 前后值一致时,交换两者的顺序
                    int tmpCpm = result[0];
                    result[0] = result[1];
                    result[1] = tmpCpm;
                }
                return result;
            }
        }
    }
    

    上述算法时间复杂度 O(nlogn) , 第一个for循环的时间复杂度为O(n), 排序的时间复杂度最优为 O(nlogn), while循环的时间复杂度为 O(n), 取最大范围的则为O(nlogn)。

    空间复杂度 O(n) , 原始坐标location, 排序对象numList 都可以视为 O(n), 则相加为O(2n) ,忽略常系数则为 O(n)。

    关于此种算法并没有第二种方法有优势,而且操作流程相对繁琐一些,用来参考,拓展思路即可。

    小结

    你可能很久之前已经做过“两数之和”这道题,但阅读完本篇文章之后,是否产生了新的思考?希望这文章能够让你从另外一个层面来学习“两数之和”这道题,而不是仅仅刷了一道算法题。


    程序新视界

    公众号“ 程序新视界”,一个让你软实力、硬技术同步提升的平台,提供海量资料

    微信公众号:程序新视界

    展开全文
  • 1.一定要独立思考的能力,不能一看题目觉得不会立马就看题解,说实话这样单纯就是浪费时间和这些好题目。 2.如果实在没思路或者说已经卡了三四个小时了,那就建议看看题解,否则自己的游戏体验也会很差,但是看...
  • 现代商业离不开对用户的理解,任何业务的决策者都不会希望在认识用户上存在盲区,因此在用研的日常工作中,“一个用户画像”是经常收到的需求。但同样的需求背后,往往对应着不同的目标和问题,搞清楚了解用户能...
  • 软件测试工程师经典面试

    万次阅读 多人点赞 2018-10-27 23:55:52
      软件测试工程师,和开发工程师相比起来,虽然前期可能不会太深,但是涉及的面还是比较广的。前期面试实习生或者一年左右的岗位,问的也主要是一些基础性的问题比较多。涉及的知识主要MySQL数据库的使用、Linux...
  • 一道小学奥数不会做,求解答

    千次阅读 2014-03-24 10:03:53
    看似很简单的题目,想了好久就没找到答案。。。。求高手指点。
  • 有一道选择,ABC三个选项,一个正确答案, 假设你选择了A,但是通过计算知道C是错误答案,问B是正确答案的概率是多少. 这道题有人认为A应该和B,C分开, 利用部分整体思想, 此时B应该共享C的概率, 因此B正确的概率...
  • 回到正题,今天写下我的第一篇博客,讨论的是阿里巴巴之前的一道笔试, 斗胆拿出来和大家探讨一下,大神看到了请移步啊  大神:卧槽,这么简单的问题你也敢拿来怼文章?  菜鸟:呃……,好吧
  • 这里就带着大家一起来这道。 ① 全选数据区域 ② 点击开始—>自定义排序 ③ 当出现如下界面,完成图中操作,实现“学历”的自定义排序 点击“确定”后,再完成图中所示操作。 ④ 点击添加条件,完成“基本工资”...
  • 如果你能在没有源的情况下自己想出一道新的题目,想必也很难看到这篇文章了。源是出题的第一步,相信到了需要出题的地步,正在看这篇博客的你一定自己熟悉的刷题网站,而这个网站可以作为你的源,因为熟悉。...
  • 一道题带你认识ACM竞赛

    万次阅读 多人点赞 2017-09-07 23:50:58
    就像我们解数学,看完题目你会了,你脑袋里思路,但是应该怎么表达出来呢?这个时候你就要需要数学符号,用数学的语言去解释这道题目应该怎么解。然后数学老师就会看懂你的话,并理解你的思路。   同样...
  • C语言 每天做一道编程

    千次阅读 2016-03-13 22:25:14
    好久没编程了,算法和数据结构该忘的也都忘干净了,今天开始至少每天,然后写写tips吧,各种都可以。 3.13 写了两道简单的PAT:3n+1(卡拉兹猜想)和将数字转换成拼音  主要是体会一下输入字符串的三种...
  • 一道字节跳动的算法面试

    万次阅读 多人点赞 2019-08-30 12:15:00
    点击蓝色“五分钟学算法”关注我哟加个“星标”,天天中午 12:15,一起学算法作者 | 帅地来源公众号 | 苦逼的码农前几天个朋友去面试字节跳动,面试官问了他一道链表相...
  • 题目1000个一模一样的瓶子,其中999瓶是普通的水,一瓶是毒药。任何喝下毒药的生物都会在一星期之后死亡。现在,你只有10只小白鼠和一星期的时间,如何检验出那个瓶子里毒药? 最近在知乎上看到很火的一...
  • 史上最难的一道Java面试 (分析篇)

    万次阅读 多人点赞 2017-10-16 19:56:45
    简书 匠心零度 ...无意中了解到如下题目,觉得蛮好。题目如下:public class TestSync2 implements Runnable { int b = 100; synchronized void m1() throws InterruptedException { b = 1000; T
  • 一般技术含量的人都会希望自己能考一个高大上的证书来证明自己,像华为R&amp;...其实,HCIE笔试中也不是每道想象中的那么难。 下面是5道就相当HCIE水平,大胆试一下(假设每...
  • 百度二面时候的一道题

    千次阅读 2012-05-14 22:16:33
    这是在百度实习生时候二面的面试官出的一道JS。 var n = 30; var j = 0; for(var i = 0; i ; i--){ if(j++ > 100) break; } console.log(j); 题目大概是这样的。本来for循环里第三条语句为i++; 但因为写代码...
  • Python神器可以拯救小学数学题不会做

    万次阅读 多人点赞 2021-06-29 17:50:18
    虽说只是一道小学数字,但作为渣渣我是真的不会做。虽然我不会做,但是我会Python,所以可以让Python帮我做。 不过这张老师会做,这是他的解法: 张老师的解法 首先作辅助线: 根据容斥原理,S(阴影部分面积)=S...
  • 软件设计师中级攻略

    千次阅读 2019-08-12 22:49:29
    我是大三下学期用了接近两个月的时间复习的, 课本细看一遍, 然后选择一定要多刷, 还有大, 大的类型一般是固定的, 只要懂,一般下午不会挂, 前提是 你得用心! 至于作用, 很多人说是没用的, 我在此只想说一句...
  • PAT乙级做题总结

    千次阅读 多人点赞 2018-11-23 20:50:12
    具体而言,当面临一个编程时,不是编程知识为我所用,不能随心所欲地按照自己如何思考的去编写代码,而是还需要考虑自己会不会,使用的数据结构类型是否掌握的比较熟练。这正是编程实战经验...
  • ![如果在oracle中如何写这SQL语句?](https://img-ask.csdn.net/upload/201603/23/1458696193_842586.jpg)
  • 的目标很简单,就是判断一个给定的正整数是否素数。 输入格式: 输入在第一行给出一个正整数N(≤ 10),随后N行,每行给出一个小于2 ​31 ​​ 的需要判断的正整数。 输出格式: 对每个需要判断的正整数,如果...
  • 写下这个题目的时候,脑海里无法抑制地响起了周华健那略带沙哑的歌声:远处传来那首熟悉的歌,那些心声为何那样微弱。很久不见,你现在都还好吗?没有那么一首歌,会让你轻轻跟着和,随着我们生命起伏,一起唱的...
  • 一道经典的 JavaScript 面试

    千次阅读 2018-04-20 18:57:59
    最近,在温习前端知识时,看到一道非常好的 JavaScript 面试,这里个分享,并附上我的分析。 问题 function Foo() { getName = function () { alert (1); }; return this; } Foo.getName = function () ...
  • CTF比赛的一道javascript

    千次阅读 2016-03-14 19:52:20
    CTF比赛中的一道javascript,考察了很多知识。在做题的过程也很有趣,在此发表给大家

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 78,245
精华内容 31,298
关键字:

又有一道题不会做了