C語言——小知識和小細節18

一、力扣題目

1、題目本體

2、題解

本題目我們使用異或分組的方法來解決。可以在我之前的文章《C語言——操作符CSDN博客》中看一下異或的特點。

由于異或的運算規則為相同為0,不同為1,而且是在二進制補碼上進行操作的,我們可以發現的一個特點就是相同的數字異或的結果是0,利用這一點,我們好像就對上面的題目有了些許想法。

對于整個數組,只有兩個出現一次的數字,其他的數字都是出現兩次的,所以們可以發現,如果我們將數組所有的元素都異或起來,結果就是兩個只出現一次的兩個數字異或起來的結果。就像下面:

    int res = 0;int i = 0;for (i = 0; i < numsSize; i++) {res ^= nums[i];}

然后我們得到的這個res就是可以反映這兩個只出現一次的數字的不同的位的,下面舉個例子:

假設兩個只出現一次的數字是 5 和 6,它們的二進制為101和110,異或后得到的結果的二進制為011。然后我們得到這個結果的目的就是將這兩個不同的數字分開,可以發現結果中為 1 的位,也是這兩個數字的不同的位,我們可以直接取到結果中第一個為1的位,通過這個位來將兩個數分在不同組中,然后分別將兩個組異或起來,就可已得到這兩個數字。

3、代碼

int* singleNumber(int* nums, int numsSize, int* returnSize) {int res = 0;int i = 0;for (i = 0; i < numsSize; i++) {res ^= nums[i];}int pos = 0;for (pos = 0; pos < 32; pos++) {if (((res >> pos) & 1) == 0) {break;}}int num1 = 0;int num2 = 0;for (i = 0; i < numsSize; i++) {if (((nums[i] >> pos)& 1) == 0) {num1 ^= nums[i];}else {num2 ^= nums[i];}}int* ans = (int*)malloc(2 * sizeof(int));ans[0] = type1;ans[1] = type2;*returnSize = 2;return ans;
}

4、解釋

    for (i = 0; i < numsSize; i++) {res ^= nums[i];}

將數組中所有元素異或起來,得到 res 。

    for (pos = 0; pos < 32; pos++) {if (((res >> pos) & 1) == 0) {break;}}

用來找到 res 中第一個為1的位,然后使用 pos 變量來保存這個位是第幾位,以便后面使用。

    int num1 = 0;int num2 = 0;for (i = 0; i < numsSize; i++) {if (((nums[i] >> pos)& 1) == 0) {num1 ^= nums[i];}else {num2 ^= nums[i];}}

這一步完成分組和分別將兩個組的元素都異或起來,兩步合在了一起。

    if (((nums[i] >> pos)& 1) == 0) {num1 ^= nums[i];}

如果數組中的元素的 pos 位也為 1 的話就分一組,然后依次異或起來,這時那兩個只出現一次的數字已經被分開,這里只有其中之一。

    else {num2 ^= nums[i];}

如果數組中的元素的 pos 位0為 0 的話就分一組,然后依次異或起來,0,這里只有其中另一。

這樣的活,其他相同的數字被分到哪一組都無所謂,它們兩個一對會被分到一組,因為兩個相同的數字的同一位是相同的。這樣異或起來,最后,num1 和 num2 中就剩下那兩個只出現一次的數字了。

二、模擬實現atoi函數

1、atoi函數介紹

在C語言中,atoi(ASCII to Integer)是一個標準庫函數,用于將表示整數的字符串轉換為其對應的整數值。該函數定義在stdlib.h頭文件中。

函數原型

int atoi(const char *str);

參數

str:指向一個以空字符('\0')結尾的字符串,該字符串表示一個整數。

參數

返回轉換后的整數值。
如果字符串中不包含合法的整數,atoi的行為未定義,可能返回0或其他值。

2、模擬實現

#include <stdio.h>
#include <limits.h>int my_atoi(const char* str) {const char* string = str;while (*string == ' ') {//跳過前置空格string++;}int flag = 0;if (*string == '-') {//判斷數字正負flag = -1;string++;}else if (*string == '+') {flag = 1;string++;}long long retValue = 0;while (*string) {//計算數字本體if (*string <= '9' && *string >= '0') {retValue = retValue * 10 + (long long)((*string - '0') * flag);if (retValue > INT_MAX || retValue < INT_MIN) {//判斷是否越界return 0;}}else {return (int)retValue;}string++;}return (int)retValue;
}int main() {char str[] = "    -123878";int res = my_atoi(str);printf("%d", res);return 0;
}

運行結果:

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/14960.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/14960.shtml
英文地址,請注明出處:http://en.pswp.cn/web/14960.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

c++|多態

c|多態 1 多態的概念2 多態的定義及其實現2.1 滿足多態的條件2.2 虛函數2.3 虛函數的重寫2.4 析構函數適合加virtural嗎2.4 C11 override 和 final2.5 三個概念的對比 3 多態的原理4 抽象類4.1 概念4.2 純虛函數 1 多態的概念 多態的概念&#xff1a;通俗來說&#xff0c;就是…

2413. 最小偶倍數

題目&#xff1a; 給你一個正整數 n &#xff0c;返回 2 和 n 的最小公倍數&#xff08;正整數&#xff09;。 示例 1&#xff1a; 輸入&#xff1a;n 5 輸出&#xff1a;10 解釋&#xff1a;5 和 2 的最小公倍數是 10 。 示例 2&#xff1a; 輸入&#xff1a;n 6 輸出&a…

JS 手寫 節流throttle 防抖debounce函數

防抖debounce // 手寫防抖 function debounce(fn, delay 200) {// timer 在閉包中let timer null// 返回一個函數return function(...args) {if (timer) {clearTimeout(timer) // 清空上次的值}timer setTimeout(() > {fn.apply(this, args) // 透傳 this 和函數參數},…

【再探】設計模式—代理模式

代理是指授權代理人在一定范圍內代表其向第三方進行處理有關事務。 1 代理模式 需求&#xff1a;1&#xff09;將業務代碼與非業務代碼分離&#xff0c;在不改變代碼結構的基礎上&#xff0c;為其添加新的功能。2&#xff09;為系統中的某些操作做同一處理&#xff0c;例如進…

[實例] Unity Shader 逐像素漫反射與半蘭伯特光照

漫反射光照是Unity中最基本最簡單的光照模型&#xff0c;本篇將會介紹在片元著色器中實現反射效果&#xff0c;并會采用半蘭伯特光照技術對其進行改進。 1. 逐頂點光照與逐像素光照 在Unity Shader中&#xff0c;我們可以有兩個地方可以用來計算光照&#xff1a;在頂點著色器…

數據結構:帶頭雙向循環鏈表

目錄 前言 鏈表實現 1.定義節點 2.接口實現 1.開辟新節點 2.初始化 3.打印鏈表 4.添加節點 頭插 尾插 在pos位置之前增加節點 5.刪除節點 判空 頭刪 尾刪 刪除pos位置的節點 6.查找 7.釋放 前言 帶頭雙向循環鏈表的結構最復雜&#xff0c;一般用在單獨存儲數…

z3-加法器實驗

補碼器加減法&#xff0c;運算方法簡介 我們要知道什么是補碼的加法&#xff0c;我們為什么要用補碼的加法&#xff1f; 補碼的加法其實就是將兩個補碼形式的二進制數字直接相加&#xff0c;處理的時候忽略超出固定位數的進位。補碼的加法運算和無符號二進制數的加法操作一樣&…

【最新區塊鏈論文錄用資訊】CCF A — SP 2024 共17篇

Conference&#xff1a;45th IEEE Symposium onSecurity and Privacy CCF level&#xff1a;CCF A Categories&#xff1a;網絡與信息安全 Year&#xff1a;2024 Num&#xff1a;17 Efficient Zero-Knowledge Arguments For Paillier Cryptosystem Paillier 加密系統的有效…

基于python的網頁自動刷新工具

1.下載webdriver https://msedgewebdriverstorage.z22.web.core.windows.net/?prefix122.0.2365.59/下載Edge的瀏覽器驅動 2.安裝selenium pip install selenium4.11.1 3.寫代碼 # -*- coding: utf-8 -*- import tkinter as tk from tkinter import messagebox import thr…

【halcon】set_part 實現平移和縮放 徹悟版

背景 之前寫了一篇關于set_part 的文章 &#xff0c;確實也實現了平移和縮放。平移是對的&#xff0c;但是縮放其實有畸變。這個問題一直都困擾著我&#xff0c;知道昨天連續測試了好幾個小時&#xff0c;直到晚上11點終于完美解決。 坐標和高寬 坐標 再講set_part 之前&am…

免費擼gpt-4o和各種大模型實用經驗分享

項目 Github: https://github.com/MartialBE/one-api 先貼兩張圖&#xff1a; 說明 免費擼AI大模型,各位可以對照下面我給出的大模型記錄表來填&#xff0c;key需要自己去拿&#xff0c;國內都需要手機號驗證&#xff0c;如果你不介意。另外我在自己的博客放出免費API給大家…

模型評價指標筆記:混淆矩陣+F1+PR曲線+mAP

評價指標 二分類評價指標 混淆矩陣 TP: 正確預測為了正樣本&#xff0c;原來也是正樣本 FN: 錯誤的預測為負樣本&#xff0c;原來是正樣本 (漏報&#xff0c;沒有找到正確匹配的數目) FP: 錯誤的預測為正樣本&#xff0c;原來是負樣本 (誤報&#xff0c;沒有的匹配不正確) TN…

CIM模型

CIM 是 Esri 制圖信息模型。 它是一個地圖內容規范,用于記錄在保存、讀取、引用或打開時如何永久保留描述不同項目組件的信息。 該規范以 JSON 表示,適用于 ArcGIS 應用程序和 API 中的地圖、場景、布局、圖層、符號和樣式。 CIM 不僅限于制圖設置。 要了解屬性的組織方式以及…

【Tools】SpringBoot工程中,對于時間屬性從后端返回到前端的格式問題

Catalog 時間屬性格式問題一、需求二、怎么使用 時間屬性格式問題 一、需求 對于表中時間字段&#xff0c;后端創建對應的實體類的時間屬性需要設定格式&#xff08;默認的格式不方便閱讀&#xff09;&#xff0c;再返回給前端。 二、怎么使用 導入jackson相關的坐標&#x…

Vue.js - Vue 的安裝 以及 常用的 Vue 指令 【0基礎向 Vue 基礎學習】

文章目錄 Vue 快速上手1、Vue.js 官網 & Vue.js 的獲取2、創建 Vue 實例&#xff0c;初始化渲染3、插值表達式 安裝 Vue 開發者工具&#xff1a;裝插件調試 Vue 應用Vue 指令1、v-show 指令2、v-if3、v-else & v-else-if4、v-onv-on 調用傳參 5、v-bindv-bind 對于樣式…

【算法】前綴和算法——和為k的子數組之和

題解&#xff1a;和為k的子數組之和(前綴和算法) 目錄 1.題目2.題解思路2.1前綴和 哈希表&#xff0c;算法步驟&#xff1a;2.2細節如下&#xff1a;2.3參考代碼&#xff1a; 3.總結及思考 1.題目 題目鏈接&#xff1a;LINK 2.題解思路 暴力求解自然不用多說&#xff0c;時…

【SQL】外連接 LEFT JOIN

目錄 一.內連接與外連接 1.內連接&#xff08;inner join&#xff09; 2.外連接&#xff08;outer join&#xff09; 二.兩表連接 1.我們先來試試看內連接&#xff1a; 2.我們再來試試外連接 三.單表外連接 四.總結 一.內連接與外連接 先得介紹內連接和外連接兩個概念&…

第199題|關于函數的周期性問題|函數強化訓練(六)|武忠祥老師每日一題 5月24日

解題思路&#xff1a;解這道題我們要用到下面這個結論 f(x)連續&#xff0c;以T為周期時&#xff0c;原函數以T為周期的充分必要條件是&#xff1a; (A) sin x顯然是以π為周期的&#xff0c;我們可以看到并不等于0,根據結論&#xff0c;A的原函數顯然不是周期函數。 (B) 的…

memmove使?和模擬實現

一&#xff1a;memmove的使? 這是memmove在庫里的定義&#xff0c;具體可在cplusplus.com查看 void * memmove ( void * destination, const void * source, size_t num ) ? 和memcpy的差別就是memmove函數處理的源內存塊和?標內存塊是可以重疊的。 ? 如果源空間和?標…