zoukankan      html  css  js  c++  java
  • 剑指offer-寻找数组中只出现一次的两个数,倒置句子的单词顺序,左旋数组。

    寻找数组中只出现一次的数字,一共两个。

    思路

    先思考怎么在一个数组中找到只出现一次的一个数字。 用异或的方法。一个数异或它本身为0,那么对数组中所有的数字都异或,相同的数字抵消,剩下的就是所求的数。
    再考虑把数组分离成两个,每个数组各有一个只出现一次的一个数字。把这个数组的所有数字异或后的结果为所求的两个数字的异或,这个数字肯定不为0,取最低不为0的一位作为标准,分离数组,不可能出现数字相同的两个数字在不同小组。同时把所求的两个数字也分离了。(就是因为它们二进制某一位不同,异或后这一位才不同)

    代码:

    bool IsBit1(int num, int indexBit)  //判断某一位是否是1
    {
    	num = num >> indexBit;
    	return (num & 1);
    }
    int FindFirstBitIs1(int num)   //找到最低位的1
    {
    	int indexBit = 0;
    	while ((num & 1) == 0 && (indexBit < 8 * sizeof(int)))
    	{
    		num = num >> 1;
    		indexBit++;
    	}
    	return indexBit;
    }
    void FindNumsAppearOnce(int data[], int len, int* num1, int* num2)
    {
    	if (data == NULL || len <= 0)
    		return;
    	int resultOR = 0;
    	for (int i = 0; i < len; i ++)
    	{
    		resultOR ^= data[i];
    
    	}
    	int indexOf1 = FindFirstBitIs1(resultOR);
    	*num1 = 0;
    	*num2 = 0;
    	for (int j = 0; j < len; j++)
    	{
    		if (IsBit1(data[j], indexOf1))
    			(*num1)= (*num1) ^ data[j];
    		else
    			(*num2) = (*num2) ^ data[j];
    	}
    }
    

    倒置句子的单词顺序,左旋数组

    思路:

    倒置整个字符串,再分别倒置整个单词。左旋数组也是整个思路。

    代码:

    void MyReverse(char* pbegin, char* pend)
    {
    	if (pbegin == NULL || pend == NULL)
    	{
    		return;
    	}
    	while (pbegin < pend)
    	{
    		char temp = *pbegin;
    		*pbegin = *pend;
    		*pend = temp;
    		pbegin++;
    		pend--;
    	}
    }
    char* ReverseWord(char* pdata)
    {
    	if (*pdata == NULL)
    	{
    		return NULL;
    	}
    	char* pbegin =pdata;
    	char* pend = pdata;
    	while (*pend != '')
    		pend++;
    	pend--;
    	MyReverse(pbegin, pend);
    	pend = pdata;
    	pbegin = pdata;
    	while (*pbegin != '')  //反转每个单词
    	{
    		if (*pbegin == ' ') //一个单词结束
    		{
    			pbegin++;
    			pend++;
    		}
    		else if (*pend == ' ' || *pend == '')  //找到一个单词
    		{
    			MyReverse(pbegin, --pend);
    			
    			pbegin = ++pend;
    		}
    		else  //pend没有读取到一个单词的末尾;
    		{
    			pend++;
    		}
    	}
    	return pdata;
    }
    char* LeftRotateString(char* pdata,int n)
    {
    	if (pdata == NULL)
    		return NULL;
    	int len = strlen(pdata);
    	if (len > 0 && n > 0 && n < len)
    	{
    		char* pbegin = pdata;
    		char* pend = pdata + len - 1;
    		MyReverse(pbegin, pend);
    		pbegin = pend;
    		pbegin = pend - n + 1;
    		MyReverse(pbegin, pend);
    		pend = pbegin - 1;
    		pbegin = pdata;
    		MyReverse(pbegin, pend);
    	}
    	return pdata;
    }
    
  • 相关阅读:
    【第3版emWin教程】第27章 emWin6.x支持的字体简介
    【第3版emWin教程】第26章 字符编码和点阵字体基础知识(重要)
    嵌入式新闻早班车-第13期
    《安富莱嵌入式周报》第221期:2021.07.12--2021.07.18
    嵌入式新闻早班车-第12期
    TI发布采样率12.8Gsps,带宽6GHz,12bit分辨率高速示波器参考设计
    【DSP教程】第36章 FIR滤波器的Matlab设计(含低通,高通,带通和带阻)
    嵌入式新闻早班车-第11期
    【DSP教程】第35章 FIR有限冲击响应滤波器设计
    【STM32F407&F429&H7的DSP教程】第34章 滤波器基础知识
  • 原文地址:https://www.cnblogs.com/void-lambda/p/12431817.html
Copyright © 2011-2022 走看看